JTable:在Tab上选择下一个单元格,但第一个焦点选择相同的单元格,而不是下一个单元格

时间:2011-10-05 03:59:09

标签: swing focus jtable edit next

我想:

  • 有一个按钮向JTable添加一行
  • 创建该行时,将其设为焦点并开始编辑第一列
  • 当用户按Tab键时,选择下一列。

对于Add按钮,我这样做:

add_button.addActionListener(new java.awt.event.ActionListener() {
    @Override
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        int row = table_model.addRow();
        table.setRowSelectionInterval(row, row);
        table.scrollRectToVisible(table.getCellRect(row, 0, true));
        table.editCellAt(row, 0);
        table.transferFocus();
        did_add = true;
    }
});

这确实会导致表格单元格获得焦点并开始编辑。为确保按Tab键选择下一个单元格,我有:

table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0, false), "selectNextColumnCell");

这是我的问题:

  • 如果我之前选择了任何细胞,那么这种方法非常有效。我可以编辑第一列,然后按Tab键,这会导致选择下一列。
  • 但是,如果这个表是新创建的,或者该表之外的某个小部件以前有焦点,我单击“添加”按钮,则会发生以下情况:
    • 第一列已正确选择且可编辑
    • 当我按Tab键时,通常会聚焦相同的单元格
    • 我必须再次按Tab键转到下一栏
    • 有时,第一个标签实际上转到单元格0,0

所以,似乎虽然细胞被聚焦并被编辑,但是桌子的焦点有些不对,因为下一个细胞是不正确的。

我尝试了一些涉及将焦点设置到表格的解决方法,但似乎没有工作(requestFocus,requestFocusInWindow,设置表格选择等)。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

这是因为通过设置表的行选择来更改列选择 :在启动时它未被选中,然后导航到下一列(也就是:从已编辑的标签中删除)将其设置为第一栏。要解决此问题,请设置列选择以及行选择

   table.setRowSelectionInterval(row, row);
   table.setColumnSelectionInterval(0, 0);