JTable中单元格编辑的问题

时间:2013-12-04 16:07:35

标签: java swing jtable tablecelleditor celleditorlistener

我在JTable中使用单元格编辑遇到了一些麻烦。

首先,我创建了一个函数来处理按下ENTER时的水平滚动,当它到达最后一列时,它再次从下一列的第一个单元格开始。这很好但问题是,当我单击一个单元格并使其可编辑时,ENTER不会触发Action(我必须将它推两次,一次用于停止编辑,第二次用于开始编辑下一个单元格)。它仅识别在选择单元格时按下ENTER(仅限第一次)。在此之后,当我继续按ENTER时,即使单元格可编辑,也会始终触发Action。

另一方面,我有一个单元格监听器,可以在编辑某些单元格时执行某些操作,但在按下ENTER时总是会触发两次。

那么,有什么建议吗?我希望我已经清楚地解释了这一点。

datosTabla = new Object[10][columnas_tabla.length];
    modelo = new DefaultTableModel(datosTabla, columnas_tabla);

    tabla = new JTable(modelo);

    CellEditorListener changeNotification = new CellEditorListener() {
        public void editingCanceled(ChangeEvent e) {

        }

        public void editingStopped(ChangeEvent e) {
            System.out.println("Do stuff");
        }
    };
    tabla.getDefaultEditor(Object.class).addCellEditorListener(changeNotification);

    Action handleEnter = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {

            int row = tabla.getSelectedRow();
            int col = tabla.getSelectedColumn();

            if (col < modelo.getColumnCount() - 1){
                col++;
            } else {
                row++;
                col = 0;
            }
            tabla.changeSelection(row, col, false, false);
            tabla.editCellAt(row, col);
        }
    };

    tabla.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "handleEnter");
    tabla.getActionMap().put("handleEnter", handleEnter);

1 个答案:

答案 0 :(得分:1)

  

问题是,当我点击一个单元格时   使它可编辑,然后ENTER不会触发动作(我必须推动   它两次,一次用于停止编辑,第二次用于开始编辑   下一个细胞)。它只识别在选择单元格时按下ENTER   (只是第一次)。在此之后,我总是触发Action   继续按ENTER即使单元格可编辑

您对编辑器组件的焦点有疑问。

  1. 当您使用鼠标双击单元格时,您的单元格编辑器会收到焦点,使用按键的任何输入都会被反映出来,按Enter键将由编辑器组件接收,但不会被表格接收。

  2. 对于第二种情况,当您在所选行上按Enter键(但编辑器尚未显示)时,表本身会侦听Enter按,显示您编码的编辑器,任何按键是反映在编辑器上,再次单击Enter时,表格接收它,停止编辑并转到下一个单元格。

  3. 作为解决方案,您可以声明自定义单元格编辑器并实现ActionListeneractionPerformed函数以响应预期的行为。查看demo exampletutorial page example了解实施方法和详细信息。