我使用camickr下面提供的代码作为参考,添加了一个组合框作为单元格编辑器:
camickr
如何将唯一的JComboBoxes添加到JTable中的列(Java)
除了我的情况,我只需要一个组合框即可用于列中的所有单元格。我遇到的问题是,组合框会自动选择最后一个选定的项目(或不确定当前选定的项目),并且由于不同的行共享同一个组合框,因此如果单击其中一个单元格,它将自动更改到最后选择的项目。
作为快速演示,我只是从上面修改了代码以显示问题。我希望组合框自动在列表中选择一个与在选定单元格中设置的项目相同的项目(而不是选择一个单元格,然后使该单元格的内容自动更改)
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<TableCellEditor> editors = new ArrayList<TableCellEditor>(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编辑器中选择TableModel中的值。由于表中的数据与comboBox中的任何条目都不匹配,因此选择不会更改,因此在编辑器中将“ Red”显示为值。
当您从编辑器中进行选择时,该值将被保存在模型中,并在您下次编辑单元格时正确显示。
解决您的问题的方法是确保TableModel在创建时包含有效数据。只有这样,才能在comboBox中选择适当的项目。
我想我必须将一个动作侦听器附加到组合框,以确定要选择的项目
不,当您使用comboBox作为编辑器时,您不会在其上玩监听器。comboBox编辑器会自动为您选择项目。