使用包含值的对象创建JComboBox

时间:2014-05-16 14:46:07

标签: java jcombobox

我正在尝试创建一个JComboBox,它将在其中保存播放列表对象。我希望它拥有播放列表的字符串标题,即键/显示值,以及对实际播放列表的引用,以便当用户单击与所选播放列表相关的按钮时可以直接访问它。组合框的内容将由用户动态更改,因此另一个问题中的某人建议使用DefaultComboBoxModel来允许它自行更新。我看到这个问题Adding items to a JComboBox建议将项目包装在一个新类中。我试过了,但现在我的组合框出现了空白。

我的旧代码:

String[] playlistsStringArray = {"Library"};
JComboBox playlists = new JComboBox(playlistsStringArray);
DefaultComboBoxModel model;

// worked but only held strings.  I was having trouble referencing the playlist itself
model = new DefaultComboBoxModel(playlistsStringArray);  
playlists.setModel(model); 

我目前的代码:

ComboItem myLibCombo = new ComboItem("Library", myLibrary);
DefaultComboBoxModel model;
ComboItem[] comboItems = new ComboItem[0];
JComboBox comboPlaylists = new JComboBox(comboItems);

// empty combo box
model = new DefaultComboBoxModel(comboItems);  
comboPlaylists.setModel(model); 
comboPlaylists.addItem(myLibCombo);

也尝试过:

ComboItem myLibCombo = new ComboItem("Library", myLibrary);
DefaultComboBoxModel model;
ComboItem[] comboItems = {myLibCombo};
JComboBox comboPlaylists = new JComboBox(comboItems);

// empty combo box
model = new DefaultComboBoxModel(comboItems);  
comboPlaylists.setModel(model); 

有更简单的方法吗?或者,我最好的选择是将播放列表保存在一个数组中并每次搜索匹配的标题?任何建议都将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:1)

  

我看到这个问题将项目添加到JComboBox建议将项目包装在新类中。我试过了,但现在我的组合框出现了空白。

是的,这是最简单的解决方案。

  

我试过这个,但现在我的组合框出现了空白。

然后你做错了什么。诀窍是确保覆盖ComboItem类的toString()方法。你没有发布适当的SSCCE,所以我们无法猜出你做错了什么。

有关详细信息,请查看Combo Box With Hidden Data,其中详细说明了此概念。

有些人不喜欢覆盖toString()方法的想法,在这种情况下,您可以在使用自定义渲染器时查看Combo Box With Custom Renderer以获得更完整的方法。

答案 1 :(得分:0)

这里我将使用我使用Employee对象而不是Playlist对象创建的示例。

JComboBox cmbEmployees = new JComboBox<Employee>();
EmployeeListListener itemListener = new EmployeeListListener();
cmbEmployees.addItemListener(itemListener);

每次加载包含JComboBox的面板时,都会调用此方法来填充JComboBox。

public void updateEmployees() {
    cmbEmployees.removeAllItems();
    Collections.sort(frmMain.empDao.employees);
    for (Employee emp : frmMain.empDao.employees) {
        cmbEmployees.addItem(emp);
    }
}

这是内部监听器类,它确定当前选择哪个Employee

public class EmployeeListListener implements ItemListener {

    /**
     * Creates a new listener
     * 
     * @param frmMain
     *            .empDb The file of employees
     * @param frmMain
     *            The main frame.
     */
    public EmployeeListListener() {

    }

    @Override
    /**
     * Handles item state changes to update the selected employee.
     */
    public void itemStateChanged(ItemEvent e) {

        if (e.getSource() instanceof JComboBox) {
            JComboBox<?> c = (JComboBox<?>) e.getSource();
            if (c.getSelectedItem() != null
                    && (e.getStateChange() == ItemEvent.SELECTED)) {
                if (frmMain.empDao.employees.contains(c.getSelectedItem())) {
                    selectedEmp = (Employee) c.getSelectedItem();
                    frmMain.pnlEmployeeMenu.clearFields();
                }

                else if (c.getSelectedItem() instanceof String) {
                    String username = (String) c.getSelectedItem();
                    for (Employee emp : frmMain.empDao.employees) {
                        if (emp.getUsername().equalsIgnoreCase(username)) {
                            selectedEmp = emp;
                            frmMain.pnlEmployeeMenu.clearFields();
                            return;
                        }
                    }
                    System.out.println("No such employee");
                }
            }
        }
    }
}

现在,您可以通过说

来访问当前所选的任何可以访问JComboBox的Employee对象
cmbEmployees.getSelectedItem();

哦,要让JComboBox显示指定的String,您需要覆盖播放列表类中的toString()方法,例如

@Override
public String toString() {
    return playlistName();
}

希望这有帮助。