我想创建一个JTable,其最后一列带有高级选项图标。单击JTable中的最后一列时,我想要弹出一个新的JPanel,允许用户输入所需的4个字符串输入字段的输入。这个JPanel在被解雇时,应该返回原来的JTable。
我不确定从新JPanel保存4个字段的数据的位置。因为它们是每个JTable行的4个字符串输入字段,只显示在JPanel中。
我的JTabel单元格可以保存一个保存数据的对象吗?
UseCase:我有一个包含10列的JTable。它变得非常混乱所以我想将5列移动到一个新的面板,该面板将在单击原始JTable最后一列中的高级选项图标时启动。
如何将来自JPanel的数据与JTable中的行相关联的示例代码将受到高度赞赏。
答案 0 :(得分:0)
为了在单击单元格时显示弹出窗口,您需要一个单元格编辑器类。此类的主要目的是为单元格提供自定义编辑器,但您可以在单击单元格时使用它来触发某些操作:
public class InfoCellEditor extends AbstractCellEditor implements TableCellEditor {
@Override
public java.awt.Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
InfoObject info = (InfoObject) value;
editButton = new JButton(new InfoAction(info));
editButton.setText("INFO");
editButton.setEnabled(true);
}
private class InfoAction extends AbstractAction {
InfoObject info;
public InfoAction(InfoObject info) {
super();
this.info = info;
}
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, info.toString());
stopCellEditing();
}
}
}
然后,扩展JTable
类并实施getColumnClass
和isCellEditable
方法:
public class MyTable extends JTable {
public MyTable() {
super();
setDefaultEditor(InfoObject.class, new InfoCellEditor());
}
@Override
public Class getColumnClass(int columnIndex) {
if(columnIndex == 4)
return InfoObject.class;
else
return String.class;
}
@Override
public boolean isCellEditable(int row, int column) {
if(column == 4)
return true;
else
return false;
}
}
最后,您应确保将InfoObject实例插入第5列。您还可以为该列的某些自定义可视化表示实现TableCellRenderer。
Object headers = new Object[COLUMN_COUNT];
Object cells[][] = new Object[ROW_COUNT][];
...
cells[0][4] = new InfoObject(data[0]);
cells[1][4] = new InfoObject(data[1]);
table.setModel(new DefaultTableModel(cells, headers));
table.getModel().fireTableDataChanged();
table.setVisible();