1

您好我有以下代码来查看 JComboBox 中的项目是否是类(Person)的实例。

    public class ItemChangeListener implements ItemListener {

        Persoon selectedPerson;
        RekeningApp app;
        PersoonView view;

        public ItemChangeListener(PersoonView view) {

            this.view = view;

        }

        public void itemStateChanged(ItemEvent event) {
            if (event.getStateChange() == ItemEvent.SELECTED) {
                Object item = event.getItem();
                System.out.println("Itemchangelistener " + item);
                // do something with object
                if(item instanceof Persoon) {
                    System.out.println("Instance");
                    this.selectedPerson = (Persoon) item;
                    view.setOverzicht(this.selectedPerson);
                } else {
                    this.selectedPerson = null;
                }
            }
        }

    }

item 的输出是 person.name 变量的值。所以 JComboBox 中的项目实际上是字符串。

这就是 JComboBox 列表的设置方式。

personenList.addItem(persoon.getNaam());

我的问题是.. 我如何检查这个 Persoon 对象是否存在并且与 JComboBox 中的相同?

4

2 回答 2

10

您应该添加到JComboBox对象Person中,而不仅仅是名称,因此当您调用Object item = event.getItem();它时将返回.Person而不是String. 如果要在 中显示该人的姓名,请将类中的方法JComboBox重写为如下所示:toStringPerson

public String toString()
    return this.naam;
}

您应该将这些项目添加到列表中。

personenList.addItem(persoon);   

编辑

如果您不想(或可以)覆盖该toString方法,则应使用自定义渲染器。这是一个链接和示例:

http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer

于 2013-09-30T13:07:56.363 回答
9

仅出于显示目的的覆盖toString方法不是一个好习惯。这也是一个潜在的瓶颈。例如,您需要显示两个不同JComboBox的人:在其中一个中您只需要显示姓名,而在另一个中您需要显示全名。您只能覆盖Person#toString()一次方法。

要通过的方法是使用ListCellRenderer。例子:

public class Person {
    private String _name;
    private String _surname;

    public Person(String name, String surname){
        _name = name;
        _surname = surname;
    }

    public String getName() {
        return _name;
    }

    public String getSurname() {
        return _surname;
    }    
}

这是图形用户界面:

import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Demo {

    private void initGUI(){
        Person person1 = new Person("First", "Person");
        Person person2 = new Person("Second", "Person");
        Person[] persons = new Person[]{person1, person2};

        /* 
         * This combo box will show only the person's name
         */
        JComboBox comboBox1 = new JComboBox(new DefaultComboBoxModel(persons));
        comboBox1.setRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if(value instanceof Person){
                    Person person = (Person) value;
                    setText(person.getName());
                }
                return this;
            }
        } );

        /* 
         * This combo box will show person's full name
         */
        JComboBox comboBox2 = new JComboBox(new DefaultComboBoxModel(persons));
        comboBox2.setRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if(value instanceof Person){
                    Person person = (Person) value;
                    StringBuilder sb = new StringBuilder();
                    sb.append(person.getSurname()).append(", ").append(person.getName());
                    setText(sb.toString());
                }
                return this;
            }
        } );

        JPanel content = new JPanel(new GridLayout(2, 2));
        content.add(new JLabel("Name:"));
        content.add(comboBox1);
        content.add(new JLabel("Surname, Name:"));
        content.add(comboBox2);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Demo().initGUI();
            }
        });

    }
}

如果您运行此示例,您将看到如下内容:

在此处输入图像描述

如您所见,两者都JComboBox包含Person对象,但它们的表示在每个中都不同。

于 2013-09-30T14:14:23.413 回答