繁体   English   中英

JTable中的单元格编辑问题

[英]Problems with cells editing in JTable

我在JTable中进行单元格编辑遇到麻烦。

首先,我创建了一个函数,当按下ENTER键并到达最后一列时,它会处理水平滚动,它再次从下一列的第一个单元格开始。 这很好用,但是问题是,当我单击一个单元格并将其设置为可编辑状态时, ENTER不会触发该动作(我必须按两次,一次用于停止编辑,第二次用于开始编辑下一个单元格)。 仅当选择单元格时(仅第一次),它才识别出按下了ENTER键。 此后,即使单元格是可编辑的,当我继续按ENTER时总是会触发操作。

另一方面,我有一个单元格侦听器,用于在编辑某些单元格时执行某些操作,但是在按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);

问题是,当我单击一个单元格并将其设置为可编辑状态时,ENTER不会触发该动作(我必须按下两次,一次用于停止编辑,第二次用于开始编辑下一个单元格)。 仅当选择单元格时(仅第一次),它才识别出按下了ENTER键。 此后,即使单元格是可编辑的,当我继续按Enter时总是会触发操作

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

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

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

作为解决方案,您可以声明一个自定义单元格编辑器并实现ActionListeneractionPerformed函数以响应预期的行为。 查看演示示例教程页面示例,以获取实施思路和详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM