我使用以下camickr
提供的代码作为参考添加了一个组合框作为单元格编辑器:
How to add unique JComboBoxes to a column in a 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);
}
}
答案 0 :(得分:2)
默认情况下,选择组合框的第一项,在您的示例中为“红色”。
编辑单元格时,在comboBox编辑器中选择TableModel中的值。由于表中的数据与comboBox中的任何条目都不匹配,因此选择不会更改,因此“Red”将显示为编辑器中的值。
当您从编辑器中进行选择时,该值将保存在模型中,并在下次编辑单元格时正确显示。
您的问题的解决方案是确保TableModel在创建时包含有效数据。只有这样才能选择组合框中的正确项目。
我想我必须将一个动作侦听器附加到组合框以确定要选择的项目
不,当它用作编辑器时,您不会在comboBox上使用侦听器。 comboBox编辑器会自动为您选择项目。