JComboBox在多个表格单元格之间共享,自动选择当前选定的项目

我使用camickr提供的代码作为参考添加了一个combobox作为单元格编辑器:

如何将唯一的JComboBox添加到JTable(Java)中的列

除了在我的情况下,我只需要一个combobox用于列中的所有单元格。 我遇到的问题是combobox自动选择最后选择的项目(或当前选择的项目,不确定),并且由于不同的行共享相同的combobox,如果您单击其中一个单元格,它将自动更改到最后选择的项目。

作为一个快速演示,我只是修改了上面的代码来显示问题。 我希望combobox自动选择列表中的项目等于在选定单元格中设置的项目(而不是选择单元格,然后让该单元格的内容自动更改)

 import java.awt.*; import java.awt.event.*; import java.util.List; import java.util.ArrayList; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; public class Test extends JFrame { List editors = new ArrayList(3); public Test() { // Create the editors to be used for each row String[] items1 = { "Red", "Blue", "Green" }; JComboBox comboBox1 = new JComboBox( items1 ); DefaultCellEditor dce1 = new DefaultCellEditor( comboBox1 ); editors.add( dce1 ); // Create the table with default data Object[][] data = { {"Color", "Red"}, {"Shape", "Square"}, {"Fruit", "Banana"}, {"Plain", "Text"} }; String[] columnNames = {"Type","Value"}; DefaultTableModel model = new DefaultTableModel(data, columnNames); JTable table = new JTable(model) { // Determine editor to be used by row public TableCellEditor getCellEditor(int row, int column) { int modelColumn = convertColumnIndexToModel( column ); if (modelColumn == 1 && row < 3) return editors.get(0); else return super.getCellEditor(row, column); } }; JScrollPane scrollPane = new JScrollPane( table ); getContentPane().add( scrollPane ); } public static void main(String[] args) { Test frame = new Test(); frame.setDefaultCloseOperation( EXIT_ON_CLOSE ); frame.pack(); frame.setVisible(true); } } 

默认情况下,选择combobox的第一项,在您的示例中为“红色”。

编辑单元格时,在comboBox编辑器中选择TableModel中的值。 由于表中的数据与comboBox中的任何条目都不匹配,因此选择不会更改,因此“Red”将显示为编辑器中的值。

当您从编辑器中进行选择时,该值将保存在模型中,并在下次编辑单元格时正确显示。

您的问题的解决方案是确保TableModel在创建时包含有效数据。 只有这样才能选择combobox中的正确项目。

我想我必须将一个动作监听器附加到combobox以确定要选择的项目

不,当它用作编辑器时,您不会在comboBox上使用侦听器。 comboBox编辑器会自动为您选择项目。