JСписок карт?

Это связано с: Как создать динамическое изображение во время выполнения ?

После того, как у меня есть изображения страниц, я хотел бы представить их в списке, чтобы пользователь мог выбрать страницу для воспроизведения. Я знаю, что JList поддерживает изображения, но это будет отображать все изображение, теряя ощущение колоды карт. Наверное, я бы только показал край изображения с его названием и как-то выделил его.

Есть идеи?


person javydreamercsw    schedule 11.10.2011    source источник


Ответы (2)


Указатель: вы можете использовать панель слоев. а>

Возможно, вам придется изменить свое мышление с помощью JList, а затем подумать о другом компоненте, исходя из ваших потребностей пользовательского интерфейса. Вы не можете использовать LayeredPane внутри JList (да, вы можете, но не без 10 тысяч строк сложности и ошибок).

Альтернативный указатель — если вам необходимо использовать JList, рассмотрите эта запись SO

person ring bearer    schedule 11.10.2011
comment
Я шел по этому пути раньше, но это невозможно сделать в JList. Имейте в виду, что в какой-то момент в колоде могут быть даже сотни страниц, поэтому о многоуровневой панели + перетаскивании не может быть и речи. Мне нужно что-то организованное, как JList, который видит и чувствует себя как колода (как вы можете сделать с LayeredPane). - person javydreamercsw; 11.10.2011
comment
можете ли вы загрузить графическое представление того, чего вы пытаетесь достичь? Это что-то вроде «аккордеонного» управления, которое вы ищете? - person ring bearer; 11.10.2011
comment
Затем вам нужно будет использовать многоуровневую панель, как указано выше (1+), но без JList. Вам придется организовать это самостоятельно. - person Hovercraft Full Of Eels; 11.10.2011
comment
Можете ли вы дать мне ссылку на управление аккордеоном, на которое вы ссылаетесь? - person javydreamercsw; 11.10.2011
comment
Чем больше я об этом думаю, это может быть с пользовательским средством визуализации ячеек, отображающим часть изображений (верхняя часть) на всех страницах, но последняя дает ощущение этой колоды... - person javydreamercsw; 11.10.2011

Я смог вытащить его. Вы можете получить изображения из этого кода здесь: http://leepoint.net/notes-java/examples/graphics/cardDemo/cards20.zip

Карта.java

package deck.displayer;

import javax.swing.ImageIcon;

/**
*
* @author Javier A. Ortiz <[email protected]>
*/
public class Card {

private String text;
private ImageIcon icon;

public Card(String text, ImageIcon icon) {
    this.text = text;
    this.icon = icon;
}

/**
 * @return the text
 */
public String getText() {
    return text;
}

/**
 * @return the icon
 */
public ImageIcon getIcon() {
    return icon;
}
}

CardCellRenderer.java

package deck.displayer;

import java.awt.Component;
import java.awt.Font;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;

/**
 *
 * @author Javier A. Ortiz <[email protected]>
 */
public class CardCellRenderer extends JLabel implements ListCellRenderer {

    private Font uhOhFont;

    @Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    if (isSelected) {
        setBackground(list.getSelectionBackground());
        setForeground(list.getSelectionForeground());
    } else {
        setBackground(list.getBackground());
        setForeground(list.getForeground());
    }
    Card card = (Card) value;
    setIcon(card.getIcon());
    if (getIcon() != null) {
        if (index != list.getModel().getSize() - 1) {
            setIcon(new ImageIcon(createImage(new FilteredImageSource(((ImageIcon) getIcon()).getImage().getSource(),
                    new CropImageFilter(0, 0, getIcon().getIconWidth(), 20)))));
        }
        setFont(list.getFont());
    } else {
        setUhOhText(card.getText() + " (no image available)",
                list.getFont());
    }
    return this;
}
//Set the font and text when no image was found.

protected void setUhOhText(String uhOhText, Font normalFont) {
    if (uhOhFont == null) { //lazily create this font
        uhOhFont = normalFont.deriveFont(Font.ITALIC);
    }
    setFont(uhOhFont);
    setText(uhOhText);
}
}

Тест.java

package deck.displayer;

import java.net.URL;
import java.util.ArrayList;
import javax.swing.ImageIcon;

/**
 *
 * @author Javier A. Ortiz <[email protected]>
 */
public class Test extends javax.swing.JFrame {
ArrayList<Card> cards = new ArrayList<Card>();

/**
 * Creates new form Test
 */
public Test() {
    try {
        initComponents();
        String suits = "shdc";
        String faces = "a23456789tjqk";
        for (int suit = 0; suit < suits.length(); suit++) {
            for (int face = 0; face < faces.length(); face++) {
                //... Get the image from the images subdirectory.
                String imagePath = "cards/" + faces.charAt(face)
                        + suits.charAt(suit) + ".gif";
                URL imageURL = this.getClass().getResource(imagePath);
                ImageIcon img = new ImageIcon(imageURL);

                //... Create a card and add it to the deck.
                System.out.println("Adding: "+String.valueOf(faces.charAt(face))
                        + String.valueOf(suits.charAt(suit)));
                cards.add(new Card(String.valueOf(faces.charAt(face))
                        + String.valueOf(suits.charAt(suit)), img));
            }
        }
        pageList.setCellRenderer(new CardCellRenderer());
        pageList.setModel(new javax.swing.AbstractListModel() {

            @Override
            public int getSize() {
                return cards.size();
            }

            @Override
            public Object getElementAt(int i) {
                return cards.get(i);
            }
        });
    } catch (Exception e) {
        System.exit(1);
    }
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    pageList = new javax.swing.JList();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    pageList.setModel(new javax.swing.AbstractListModel() {
        String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
        public int getSize() { return strings.length; }
        public Object getElementAt(int i) { return strings[i]; }
    });
    jScrollPane1.setViewportView(pageList);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 125, Short.MAX_VALUE)
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 278, Short.MAX_VALUE)
            .addContainerGap())
    );

    pack();
}// </editor-fold>

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /*
     * Set the Nimbus look and feel
     */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /*
     * If Nimbus (introduced in Java SE 6) is not available, stay with the
     * default look and feel. For details see
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(Test.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(Test.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(Test.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(Test.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /*
     * Create and display the form
     */
    java.awt.EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            new Test().setVisible(true);
        }
    });
}
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JList pageList;
// End of variables declaration
}

Вот результат:

пример

person javydreamercsw    schedule 11.10.2011