JComboBox对象实例中的项

Res*_*had 1 java swing arraylist hashmap jcombobox

您好我有以下代码,以查看JComboBox中的项是否是类(Persoon)的实例.

    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;
                }
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

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

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

personenList.addItem(persoon.getNaam());

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

Oma*_*gra 9

您应该添加到JComboBoxPerson对象,不只是名字,所以当你调用Object item = event.getItem();这将返回Person,而不是一个String.如果要在其中显示人名,请将类中JComboBoxtoString方法覆盖为Person以下内容:

public String toString()
    return this.naam;
}
Run Code Online (Sandbox Code Playgroud)

您应该将项目添加到列表中.

personenList.addItem(persoon);   
Run Code Online (Sandbox Code Playgroud)

编辑

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

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


dic*_*c19 7

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;
    }    
}
Run Code Online (Sandbox Code Playgroud)

这是GUI:

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();
            }
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

正如您所看到的,它们都JComboBox包含Person对象,但每个对象的表示形式各不相同.