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

Java 编辑时动态增加JTable行高,完成编辑时减少,java,swing,jtable,tablecellrenderer,tablecelleditor,Java,Swing,Jtable,Tablecellrenderer,Tablecelleditor,我正在编写一个小型POS应用程序,它显示一个JTable,其单元格中包含票证信息。CellRenderer是一个扩展JPanel并实现TableCellRenderer的类,它包含几个显示基本信息(数量、描述、价格)的JTextFields。 另外,我还有一个类扩展了JPanel并实现了TableCellEditor,它被用作CellEditor。这个类包含更多的JTextFields和一些jbutton 我需要的很简单:当我用鼠标点击(或触摸屏幕,据我所知,这是同一事件)编辑任何单元格时,动态

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

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

你有什么想法吗


提前感谢。:-)

没有尝试过,但我想说实现的
mouseClicked()
方法才是最好的选择。跟踪单元格高度是否已增加,并相应更改高度

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

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

更好的方法是基于
jpopmenu
中的事件创建弹出窗口(
JDialog

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

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

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

不要这样做,但必须覆盖,这是可能的

  • defaultcelldeditor\setClickCountToStart(int)
    用于
    tablecelldeditor

  • 单元格编辑器的
    开始
    停止
    取消编辑

  • 必须
    通知
    重新布局
    JTable
    ,在
    停止
    取消编辑


不是关于如何调整行高的答案,而是我在评论中提到的另一种选择:“超大”编辑器组件,而不是更新完整的行高(我认为这对用户来说太烦人了,但当然要由您来决定:)


不,mouseListener不是您想要的:编辑可以通过多种方式启动(包括鼠标、键盘、编程等)。问题是“当我用鼠标单击编辑任何单元格时”,因此我认为这是唯一需要这种行为的情况。事实上,当所有形式的编辑都需要这种行为时,
MouseListener
并不是一条好路。欢迎来到模糊问题的现实:-)认真地说:不完整的问题不是不完整答案的借口。。。在GUI开发中,这不是简单的选择(至少)鼠标和键盘作为用户模板。同意@mKorbel的观点,即跳跃的划船高度可能会激怒用户。是否可以选择只对编辑组件进行过大处理(即使其覆盖的区域大于其正常单元格区域)?是的,将需要
CellEditor
;也考虑一下。
// 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);