【问题标题】:Accepting Focus on a JTextField and JTextArea in a Table接受对表中 JTextField 和 JTextArea 的关注
【发布时间】:2012-05-20 11:41:14
【问题描述】:

我有一个三列 JTable:一个不可编辑的 JTextField、一个可编辑的 JTextArea 和一个可编辑的 JTextField。

我的问题是双重的。我希望最后两列背景突出显示并准备好编辑,当我进入它们时,带有可见光标。他们还使用特定的字体;因此自定义渲染器和编辑器。

如果我在其中一个单元格中单击两次就成功了,但如果我使用键盘到达那里则不会。我可以从一个单元格切换到另一个单元格(感谢对 JTextArea 的 setTraversalKeys 调用)并开始输入,但焦点所在的位置不明显。

我有一个焦点事件侦听器,它为触发它的任何组件设置背景颜色。它用于用于单元格编辑的 JTextField 和 JTextArea,以及用于良好度量的单元格渲染器。但只有鼠标点击才会触发它们。

如何确保在我正在切换的单元格上触发焦点事件?

谢谢。

【问题讨论】:

  • 请编辑您的问题,在sscce 中包含您描述的问题。
  • @Elly 这可能是关于一个代码行的问题,也可能不是,用SSCCE 编辑您的问题证明了您对 Focus 和 TableCellEditor 的问题

标签: java swing jtable tablecellrenderer tablecelleditor


【解决方案1】:

您应该听取选择更改并在需要的地方开始编辑:

    final JTable table = new JTable (
            new String[][]{ { "col1", "col2", "col3" }, { "col1", "col2", "col3" } },
            new String[]{ "1", "2", "3" } );
    ListSelectionListener listener = new ListSelectionListener ()
    {
        public void valueChanged ( ListSelectionEvent e )
        {
            if ( table.getSelectedRow () != -1 && table.getSelectedColumn () != -1 )
            {
                table.editCellAt ( table.getSelectedRow (), table.getSelectedColumn () );
            }
        }
    };
    table.getColumnModel ().getSelectionModel ().addListSelectionListener ( listener );
    table.getSelectionModel ().addListSelectionListener ( listener );

这只是一个示例。

【讨论】:

    【解决方案2】:

    谢谢大家。这就是我最终得到的结果:

        ListSelectionListener listener = new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                int row = table.getSelectedRow();
                int col = table.getSelectedColumn();
    
                // Only columns beyond the first are edited...
                if (row != -1 && col > 0) {
                    table.editCellAt(row, col);
                    try {
                        Robot robot = new Robot();
                        robot.keyPress(KeyEvent.VK_F2);
                        robot.keyRelease(KeyEvent.VK_F2);
                    } catch (AWTException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        };
    

    为响应 editCell() 调用而创建的单元格编辑器在它们使用的 JTextArea 和 JTextField 上设置背景颜色。机器人的目的是模拟 F2 的按下,从而显示光标(错误的术语,我知道,但正确的术语逃脱了我)。

    机器人在向前移动时工作,但不向后移动,尽管会出现阴影。我不知道在这种情况下是否执行了这段代码 sn-p,尽管单元格编辑器是以某种方式创建的。由于这个程序仅供我自己使用,我改天尝试解决这个小问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2013-01-16
      • 2014-09-08
      • 2011-01-18
      相关资源
      最近更新 更多