我有一个JTable,我在三个不同的列中添加了三个JComboBox。 现在我想为我拥有的每一行设置所选项目。问题是,我需要每行的ID来做到这一点。 所以我尝试了不同的Listener,最好的结果来自FocusListener,但是我总是先点击行,然后点击JComboBox,这很费力。 这是一个例子:
JTable table = new JTable();
Vector<ArrayList<Object>> data = new Vector<ArrayList<Object>>();
for (int i = 0; i < 5; i++)
{
ArrayList<Object> object = new ArrayList<Object>();
object.add(i);
object.add("name");
object.add(i+1);
object.add(i+1);
object.add(i+1);
data.add(object);
}
DefaultTableModel tableModel = new DefaultTableModel() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
if (column < 2)
return false;
return true;
}
};
tableModel.setColumnIdentifiers(new String[] {"ID", "Name", "OK", "Other", "Error"});
tableModel.addTableModelListener(new TableModelListener()
{
@Override
public void tableChanged(TableModelEvent e)
{
if (e.getType() == TableModelEvent.UPDATE)
{
int row = e.getFirstRow();
int column = e.getColumn();
TableModel table_model = (TableModel) e.getSource();
ArrayList<Object> changed_data = (ArrayList<Object>) table_model.getValueAt(row, column);
String row_id = String.valueOf(table_model.getValueAt(row, 0));
for (ArrayList<Object> list : data)
{
String compare_id = String.valueOf(list.get(0));
if (row_id.equals(compare_id))
{
list.set(column, String.valueOf(changed_data.get(0)));
for (int i = table_model.getRowCount()-1; i >= 0 ; i--)
{
tableModel.removeRow(i);
}
for (ArrayList<Object> object : data)
{
Vector<String> vector = new Vector<String>();
vector.addElement(String.valueOf(object.get(0)));
vector.addElement(String.valueOf(object.get(1)));
vector.addElement(String.valueOf(object.get(2)));
vector.addElement(String.valueOf(object.get(3)));
vector.addElement(String.valueOf(object.get(4)));
tableModel.addRow(vector);
}
TableColumn column_ok = table.getColumnModel().getColumn(2);
TableColumn column_other = table.getColumnModel().getColumn(3);
TableColumn column_error = table.getColumnModel().getColumn(4);
JComboBox<ArrayList<Object>> combobox_ok = new JComboBox<ArrayList<Object>>(data);
JComboBox<ArrayList<Object>> combobox_other = new JComboBox<ArrayList<Object>>(data);
JComboBox<ArrayList<Object>> combobox_error = new JComboBox<ArrayList<Object>>(data);
column_ok.setCellEditor(new DefaultCellEditor(combobox_ok));
column_other.setCellEditor(new DefaultCellEditor(combobox_other));
column_error.setCellEditor(new DefaultCellEditor(combobox_error));
break;
}
}
}
}
});
table.setModel(tableModel);
for (ArrayList<Object> object : data)
{
Vector<String> vector = new Vector<String>();
vector.addElement(String.valueOf(object.get(0)));
vector.addElement(String.valueOf(object.get(1)));
vector.addElement(String.valueOf(object.get(2)));
vector.addElement(String.valueOf(object.get(3)));
vector.addElement(String.valueOf(object.get(4)));
tableModel.addRow(vector);
}
TableColumn column_ok = table.getColumnModel().getColumn(2);
TableColumn column_other = table.getColumnModel().getColumn(3);
TableColumn column_error = table.getColumnModel().getColumn(4);
JComboBox<ArrayList<Object>> combobox_ok = new JComboBox<ArrayList<Object>>(data);
JComboBox<ArrayList<Object>> combobox_other = new JComboBox<ArrayList<Object>>(data);
JComboBox<ArrayList<Object>> combobox_error = new JComboBox<ArrayList<Object>>(data);
column_ok.setCellEditor(new DefaultCellEditor(combobox_ok));
column_other.setCellEditor(new DefaultCellEditor(combobox_other));
column_error.setCellEditor(new DefaultCellEditor(combobox_error));
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport().add(table);
JFrame frame = new JFrame();
frame.add(scrollPane);
frame.setSize(400, 200);
frame.setVisible(true);
现在,在第一行,第三列(“OK”)中,您可以在JComboBox中选择代表一行的不同条目。所以一行有三个引用另一行的JComboBox。 如果你点击这样一个JComboBox,你会发现它总是选择第一个条目,而不是你点击它之前看到的数字条目。
也许现在你明白我想做什么了?
答案 0 :(得分:2)
如果您点击这样的
JComboBox
,您会发现它总是选择第一个条目而不是您点击之前看到的数字条目。
着眼于问题的这个方面,以下简化的完整示例始终在单元格的编辑器处于活动状态时显示所选条目。您可以替换组合的default renderer以根据需要显示不同的结果。另外,
覆盖getPreferredScrollableViewportSize()
以确定所需的表格大小。
尽可能使用类型参数;根据需要覆盖example的<{1}}。
请注意以下getValueAt()
的简化实施。
isCellEditable()