编辑时动态增加JTable行高,完成编辑时减少

时间:2012-10-04 11:22:34

标签: java swing jtable tablecellrenderer tablecelleditor

我正在编写一个小型POS应用程序,它在其单元格中显示了一个带有票证信息的JTable。 CellRenderer是一个扩展JPanel并实现TableCellRenderer的类,它包含一些显示基本信息(数量,描述,价格)的JTextField。 另外,我有另一个类扩展JPanel并实现TableCellEditor,它用作CellEditor。这个类包含更多的JTextFields和一些jButtons。

我需要的是简单的:当我通过点击鼠标(或触摸屏幕,也就是据我所知,同一事件)编辑任何单元格时,动态增加我要去的单元格的高度编辑,因此它可以显示编辑器中的所有组件。当我完成编辑后,将单元格高度返回到之前的值。

有关于这样做的想法吗?

提前致谢。 : - )

3 个答案:

答案 0 :(得分:1)

  

CellRenderer是一个扩展JPanel并实现TableCellRenderer的类,它包含一些显示基本信息(数量,描述,价格)的JTextField。另外,我有另一个类扩展JPanel并实现TableCellEditor,它用作CellEditor。这个类包含更多的JTextFields和一些jButtons。

最好是根据来自JDialog的事件创建弹出窗口(JPopupMenu),

  

编辑时动态增加JTable行高,完成编辑时减少

不要混淆用户和错误的概念可能是由于在屏幕上跳跃JTables row造成的

  

我需要的是简单的:当我通过点击鼠标(或触摸屏幕,也就是据我所知,同一事件)编辑任何单元格时,动态增加我要去的单元格的高度编辑,因此它可以显示编辑器中的所有组件。当我完成编辑后,将单元格高度返回到之前的值。

不要这样做,但必须覆盖,可以通过

  • DefaultCellEditor#setClickCountToStart(int) TableCellEditor

  • {li>

    startstopcancelEdit CellEditor

  • 必须notifyre_Layout JTablestopcancelEdit

答案 1 :(得分:1)

不是对如何调整rowHeights的答案,而是对于我的评论中提到的另一种选择:“仅仅大大超过”editorComponent而不是更新完整的rowHeight(我认为这对用户来说过于刺激,但最多你当然要决定:)

// fake a bigger editing component
JTextField oversized = new JTextField() {

    @Override
    public Dimension getPreferredSize() {
        Dimension dim = super.getPreferredSize();
        dim.height *= 5;
        return dim;
    }

};

TableCellEditor editor = new DefaultCellEditor(oversized);
JTable table = new JTable(new AncientSwingTeam()) {

    @Override
    public boolean editCellAt(int row, int column, EventObject e) {
        boolean result = super.editCellAt(row, column, e);
        if (result) {
            // adjust cell bounds of the editing component
            Rectangle bounds = getEditorComponent().getBounds();
            bounds.height = getEditorComponent().getPreferredSize().height;
            getEditorComponent().setBounds(bounds);
        }
        return result;
    }

    @Override
    public void removeEditor() {
        int editingColumn = getEditingColumn();
        super.removeEditor();
        if (editingColumn >= 0) {
            // cleanup
            repaint();
        }
    }


};
table.getColumnModel().getColumn(0).setCellEditor(editor);

答案 2 :(得分:0)

没试过,但我会说实施MouseListenermouseClicked()方法是可行的方法。跟踪细胞高度是否已经增加,并相应地改变高度。

由于MouseListener是一个接口,CellRenderer也可以实现此接口,将所有单元行为保留在一个类中。