Item in JComboBox instance of an object

僤鯓⒐⒋嵵緔 提交于 2019-11-27 09:23:11

You should add to the JComboBox the Person objects, not just the name, so when you call Object item = event.getItem(); this will return the Person, not an String. If you want to display the person's name in the JComboBox, override the toString method in Person class to something like this:

public String toString()
    return this.naam;
}

And you should add the items to the list.

personenList.addItem(persoon);   

Edit

If you don't want (or can) override the toString method you should use a custom renderer. This is a link to and example:

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

Override toString method just for display purposes isn't a good practice. Also it's a potential bottleneck. Lets say for example you need to show two different JComboBox with persons: in one of them you need to show only the name and in the other one you need to show fullname. You can override Person#toString() method only one time.

The way to go through is using a ListCellRenderer. Example:

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

And here is the 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();
            }
        });

    }
}

If you run this example you'll see something like this:

As you can see both JComboBox contain Person objects but their representation is different in each one.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!