向JComboBox添加新项不会显示

时间:2018-04-17 14:55:36

标签: java swing jcombobox

我有一个可编辑的JComboBox。当用户输入新项目时,我希望将其添加到列表中并将其显示为所选项目。我可以将它添加到列表中,但我似乎无法将其显示为所选项目。默认情况下,我会显示一个空字符串(""),这是用户编辑添加新项目的内容。

public class EventComboBoxListener implements ActionListener {

    private JComboBox<String> eventBox=null;

    public EventComboBoxListener(JComboBox<String> event_) {
        eventBox=event_;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Selected: " + eventBox.getSelectedItem());
        System.out.println(", Position: " + eventBox.getSelectedIndex());
        if (eventBox.getSelectedIndex() < 0) {
            eventBox.addItem(eventBox.getSelectedItem().toString());
            eventBox.setSelectedItem(eventBox.getSelectedItem().toString());
        }
    }

}

我必须将setSelectedItemgetSelectedItem一起使用,这对我没有意义。它不起作用并不奇怪,但我不知道还能做什么。新添加的项目应该显示在列表中,但是如何在显示中同时显示所选项?我可以选择它,但这不是必要的。

添加了MVCE:

主要

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

public class Test {

public static void main(String[] args) {
    String[] list= {"","A","B","C"};
    TestTableModel model=new TestTableModel(null,new String[] {"col1","col2"});
    JTable table=new JTable(model);
    JDialog dialog=new JDialog();
    JScrollPane scroller=new JScrollPane(table);
    JComboBox<String> box=new JComboBox<String>(list);
    box.setEditable(true);
    box.setSelectedIndex(0);
    box.addActionListener(new EventComboBoxListener(box));
    JTextField field=new JTextField();
    field.setPreferredSize(new Dimension(75,30));
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    dialog.setLayout(new FlowLayout());
    dialog.setSize(new Dimension(400,100));
    dialog.add(scroller);
    dialog.pack();
    dialog.setVisible(true);
    table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(box));
    table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(field));
    model.insertRow(0,new Object[] {"","placeholder"});
}

}

TestTableModel类

import javax.swing.table.DefaultTableModel;

public class TestTableModel extends DefaultTableModel {

/**
 * 
 */
private static final long serialVersionUID = 1L;

public TestTableModel(Object[][] data_,String[] columnNames_) {
    super(data_,columnNames_);

}

}

1 个答案:

答案 0 :(得分:1)

首先是关于MCVE的一些评论(因为将来会包含一个问题)。

我们希望代码可以在一个源文件中,这样我们就可以轻松地复制/粘贴编译和测试。我们不希望在我们的机器上放置3个文件,我们需要在测试后进行清理。

只应包含与问题直接相关的相关代码。为什么你有TestTableModel类。 “列名”是否与问题相关?关键是始终使用标准JDK类测​​试您的MCVE。

关于EventComboListener类。同样,可以通过使用和annoymouse内部类或lambda将其添加到组合框中。这使代码保持在一个类中。

  

新添加的项目应该显示在列表中,但是如何同时将其作为显示中的选定项目?

我发现在你的MCVE中玩组合框的ActionListener会在不同的时间调用。

所以我的建议是将ActionListener添加到组合框的编辑器中。然后我们确定只有在按Enter键时才会调用ActionListener。按Enter键后,编辑器将停止,并将值保存到模型中。

所以逻辑就像是:

\textspanish

所以诀窍是设置选择索引(而不是选定的项目)。但首先是逻辑检查以确保项目尚未添加到组合框中。