JTable的JComboBox单元格编辑器在打开列表时已经设置了值,即使在组合框外单击

时间:2016-12-20 20:19:48

标签: java swing jtable

JTable的{​​{1}}单元格编辑器在打开列表时已经设置了值,即使在组合框外单击也是如此。此外,一旦选择了某个值,下次打开选择时,该值将成为默认值:

enter image description here

以下是代码:

JComboBox

public class Main { public static void main(String[] args) { new QuestionFrame(); } }

QuestionFrame

这有点意义,因为import javax.swing.*; import javax.swing.table.AbstractTableModel; import java.awt.*; class QuestionFrame extends JFrame { QuestionFrame(){ class Model { int num; private Model(int n) { num = n; } } final Model[] model = {new Model(9), new Model(8), new Model(7)}; JPanel panel = new JPanel(new BorderLayout()); JTable table = new JTable(new AbstractTableModel(){ @Override public int getRowCount() { return model.length; } @Override public int getColumnCount() { return 1; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return model[rowIndex].num; } @Override public String getColumnName(int column){ return "NUM"; } @Override public Class<?> getColumnClass(int columnIndex) { return Integer.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { model[rowIndex].num = (int) aValue; } }); DefaultCellEditor cellEditor = new DefaultCellEditor(new JComboBox<>(new Integer[]{1,2,3})); cellEditor.setClickCountToStart(1); table.getColumnModel().getColumn(0).setCellEditor(cellEditor); panel.add(new JScrollPane(table), BorderLayout.CENTER); setBounds(new Rectangle(500,250,200,200)); add(panel); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } } 重用了相同的setCellEditor(cellEditor)对象实例,但我找不到另一种方法来实现它。

那么如何解决呢?

1 个答案:

答案 0 :(得分:5)

您的问题是因为当前单元格值不是组合框编辑器的可能选择之一,因此组合默认为第一个选择。如果您更改编辑器以包含当前值,例如

DefaultCellEditor cellEditor = new DefaultCellEditor(
        new JComboBox<>(new Integer[] { 1, 2,3, 4, 5, 6, 7, 8, 9 }));

然后就可以正常工作了。

如果你想对编辑器进行更精细的控制,那么你就想要自己动手而不是使用默认的。