Java - 如何显示一个输入对话框,其中包含每个项目带有图标的下拉列表?

Bra*_*rad 3 java swing input jlabel drop-down-menu

我在我的swing应用程序中使用此Java代码来显示一个带有下拉选择列表的输入对话框,以便用户可以从该列表中选择一个项目:

String[] carModelsArray = { "Honda", "Mitsubishi", "Toyota" };
String selectedValue = (String)JOptionPane.showInputDialog( null, "Select a car model from the list below:", "Car model...",
                                        JOptionPane.QUESTION_MESSAGE, 
                                        null, 
                                        carModelsArray,
                                        carModelsArray[ 0 ] );
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,但我想知道我是否还可以为选择列表中的每个项添加一个图标,因此下拉选择列表将如下所示:

在此输入图像描述

我试图将此列表中的项目设置为JLabel项目,但是当在下拉列表中呈现时,JLabel对象都被转换为String值,就像它为列表中的每个项目调用JLabel.toString()方法一样得到它的价值.

有没有办法实现这一目标?

Mad*_*mer 6

简短的回答,而不是你的方式.答案很长,更像......

在此输入图像描述

import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.kaizen.icons.AddIcon;
import org.kaizen.icons.DeleteIcon01;
import org.kaizen.icons.DeleteIcon02;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultComboBoxModel model = new DefaultComboBoxModel<Car>();
                model.addElement(new Car(new AddIcon(16, 16), "Honda"));
                model.addElement(new Car(new DeleteIcon01(16, 16), "Mitsubishi"));
                model.addElement(new Car(new DeleteIcon02(16, 16), "Tyota"));

                JComboBox cb = new JComboBox(model);
                cb.setRenderer(new CarListCellRenderer());

                int result = JOptionPane.showConfirmDialog(null, cb, "Select a car model from the list below", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
                if (result == JOptionPane.OK_OPTION) {
                    Car car = (Car) cb.getSelectedItem();
                }

            }
        });
    }

    public static class CarListCellRenderer extends DefaultListCellRenderer {

        @Override
        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            System.out.println(value);
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value instanceof Car) {
                Car car = (Car) value;
                setIcon(car.getIcon());
                setText(car.getText());
            } else {
                setIcon(null);
            }
            return this;
        }

    }

    public static class Car {

        private Icon icon;
        private String text;

        public Car(Icon icon, String text) {
            this.icon = icon;
            this.text = text;
        }

        public Icon getIcon() {
            return icon;
        }

        public String getText() {
            return text;
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

基本上,你需要控制组合框并提供你自己的自定义ListCellRedender,它可以提供你想要的输出......