【问题标题】:Dynamically Increase JTable row height when editing, and decrease when finish edit编辑时动态增加JTable行高,完成编辑后减少
【发布时间】:2012-09-25 10:11:00
【问题描述】:

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

我需要的很简单:当我通过用鼠标单击(或触摸屏幕,据我所知是同一个事件)编辑任何单元格时,动态增加我要去的单元格的高度进行编辑,因此它可以显示编辑器内的所有组件。当我完成编辑后,将单元格高度恢复为之前的值。

有什么想法吗?

提前致谢。 :-)

【问题讨论】:

  • hmm ... 同意@mKorbel 的观点,即跳跃的 rowHeights 可能会让用户感到恼火。是否可以选择仅扩大编辑组件的大小(即使其覆盖比正常单元格区域更多的区域)?

标签: java swing jtable tablecellrenderer tablecelleditor


【解决方案1】:

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

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

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

不要混淆用户,在屏幕上跳转JTables row可能会导致错误的概念

我需要的很简单:当我通过用鼠标单击(或触摸屏幕,据我所知是同一个事件)编辑任何单元格时,动态增加我要去的单元格的高度进行编辑,因此它可以显示编辑器内的所有组件。当我完成编辑后,将单元格高度恢复为之前的值。

不要这样做,但必须重写,这是可能的

  • DefaultCellEditor#setClickCountToStart(int)TableCellEditor

  • startstopcancelEdit 用于CellEditor

  • 必须 notifyre_Layout JTablestopcancelEdit 上相同

【讨论】:

【解决方案2】:

不是如何调整rowHeights的答案,而是我评论中提到的替代方案:仅“超大”编辑器组件而不是更新完整的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);

【讨论】:

    【解决方案3】:

    没有尝试过,但我想说实现MouseListenermouseClicked() 方法是可行的方法。跟踪单元格高度是否已经增加,并相应地更改高度。

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

    【讨论】:

    • 不,mouseListener 不是您想要的:可以通过多种方式开始编辑(包括鼠标、键盘、以编程方式...)
    • 问题是“当我通过单击鼠标编辑任何单元格时”,所以我认为这是唯一需要这种行为的情况。事实上,当所有形式的编辑都需要这种行为时,MouseListener 不是可行的方法。
    • 欢迎来到模糊问题的现实 :-) 说真的:不完整的问题不是不完整答案的借口……在 gui 开发中根本不是不考虑(至少)鼠标的选项 键盘作为用户手势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多