2

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

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

有什么想法吗?

提前致谢。:-)

4

3 回答 3

1

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

更好的方法是JDialog根据来自的事件创建弹出窗口 () JPopupMenu

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

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

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

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

  • DefaultCellEditor#setClickCountToStart(int)为了TableCellEditor

  • startstop并且cancelEdit对于CellEditor

  • 必须notify或,和re_Layout JTable上相同stopcancelEdit

于 2012-10-04T12:45:51.050 回答
1

不是如何调整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);
于 2012-10-04T13:31:48.107 回答
0

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

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

于 2012-10-04T11:31:45.580 回答