1

我正在构建一个自定义表格单元格编辑器,以便在编辑期间调整行高。我有这个代码,但不是调整单元格的大小,而是调整整个面板或框架的大小。当我尝试在单元格中输入字符时,主框架宽度缩小到几个像素。任何人都可以看到问题吗?

class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor {

    MyTextpane component = new MyTextpane();
    MyTable table;
    private int row;
    private int col;

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
            int rowIndex, int vColIndex) {

        ((MyTextpane) component).setText((String) value);
        component.addKeyListener(new KeyListener1());
        this.table =(MyTable) table;
        this.row = rowIndex;
        this.col = vColIndex;
        return component;
    }

    public Object getCellEditorValue() {
        return ((MyTextpane) component).getText();
    }

    public class KeyListener1 implements KeyListener {

        @Override
        public void keyTyped(KeyEvent ke) {
        }

        @Override
        public void keyPressed(KeyEvent ke) {
        }

        @Override
        public void keyReleased(KeyEvent ke) {
            adjustRowHeight(table, row, col);
        }
        private java.util.List<java.util.List<Integer>> rowColHeight = new ArrayList<java.util.List<Integer>>();
        private void adjustRowHeight(JTable table, int row, int column) {
        //The trick to get this to work properly is to set the width of the column to the
        //textarea. The reason for this is that getPreferredSize(), without a width tries
        //to place all the text in one line. By setting the size with the with of the column,
        //getPreferredSize() returnes the proper height which the row should have in
        //order to make room for the text.
        int cWidth = table.getTableHeader().getColumnModel().getColumn(column).getWidth();
        setSize(new Dimension(cWidth, 1000));
        int prefH = getPreferredSize().height;
        while (rowColHeight.size() <= row) {
            rowColHeight.add(new ArrayList<Integer>(column));
        }
        java.util.List<Integer> colHeights = rowColHeight.get(row);
        while (colHeights.size() <= column) {
            colHeights.add(0);
        }
        colHeights.set(column, prefH);
        int maxH = prefH;
        for (Integer colHeight : colHeights) {
            if (colHeight > maxH) {
                maxH = colHeight;
            }
        }
        if (table.getRowHeight(row) != maxH) {
            table.setRowHeight(row, maxH);
        }
    }

    }
}
4

2 回答 2

1

作为在编辑时调整行大小的替代方法,请考虑TablePopupEditor使用JTextArea.

于 2012-10-15T16:04:36.577 回答
1

看看

  • 我对 doLayout 的回答(可以从 CellEditor 中解雇)

  • 或(不仅仅是使用 TextUtils 的舒适方式)@kleopatra 关于 getPreferredSize 的评论

  • 这可能(非常)混淆用户,

  • 因为我想念 JScrollPane,所以必须重写 MaxSize,JScrollPane 的最大尺寸是高度和重量,否则 CellEditor 的一部分可能会超出屏幕范围......,

  • 不要那样做,把 JScrollPane 和 JTextComponents 放在那里,覆盖 CellEditor 的 PreferredSize,


一切都错了,我的看法,

  • 使用 JTextComponent 创建应用程序模式弹出窗口(仅基于 JDialog,因为 JWindow 不分配对 JTextComponent 的输入),在那里为 ESC 键实现 KeyBindings,对于 JDialog 丢失的 Fucus 也是如此,然后可以不装饰而没有任何问题

放在那里Save JButton

  • 从保存按钮重新编辑到所选单元格的输出,您不能从 JTable 内的应用程序模式中失去焦点

  • 内容应该被格式化、过滤、修改一个 JDialog 用于 JTable 中的所有单元格

于 2012-10-15T12:08:34.930 回答