繁体   English   中英

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

[英]Need to launch a new JPanel on click event in a JTable cell.

我想创建一个JTable,其最后一列带有高级选项图标。 在单击JTable的最后一列时,我希望弹出一个新的JPanel,允许用户输入所需的4个字符串输入字段的输入。 当关闭此JPanel时,应返回到原始JTable。

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

我的JTabel单元可以容纳保存数据的对象吗?

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

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

为了在单击单元格时显示弹出窗口,您需要一个单元格编辑器类。 此类的主要目的是为单元格提供自定义编辑器,但是您可以在单击单元格时使用它来触发某些操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM