需要在JTable单元中的click事件上启动新的JPanel。

时间:2015-09-29 21:11:00

标签: java swing jtable

我想创建一个JTable,其最后一列带有高级选项图标。单击JTable中的最后一列时,我想要弹出一个新的JPanel,允许用户输入所需的4个字符串输入字段的输入。这个JPanel在被解雇时,应该返回原来的JTable。

我不确定从新JPanel保存4个字段的数据的位置。因为它们是每个JTable行的4个字符串输入字段,只显示在JPanel中。

我的JTabel单元格可以保存一个保存数据的对象吗?

UseCase:我有一个包含10列的JTable。它变得非常混乱所以我想将5列移动到一个新的面板,该面板将在单击原始JTable最后一列中的高级选项图标时启动。

如何将来自JPanel的数据与JTable中的行相关联的示例代码将受到高度赞赏。

1 个答案:

答案 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类并实施getColumnClassisCellEditable方法:

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();