Java JTable如何在按下键输入时将焦点从编辑模式下的当前单元格传输到下一个单元格

时间:2016-06-24 19:42:28

标签: java swing jtable key-bindings tablecelleditor

让我介绍一下我的问题。我希望在JTable中呈现数据库表的内容。有了这个JTable,我应该能够插入新行,删除行,并更新现有行的字段内容。

第一个期望的行为是,当一个单元格获得焦点时,如果它是可编辑的,它将直接进入编辑模式,如果它是一个字母数字内容,则选择所有内容。 (文字,数字,日期等)

下一个期望的行为是Enter键用作Tab键,即按下Enter键焦点必须转移到下一个单元格(如果这是可编辑的)然后进入编辑模式)向前(从左到右)或向后。

为解决第一个要求,我使用以下方法覆盖JTable类的changeSelection方法。

@Override
public void changeSelection(int row, int column, boolean toggle, boolean extend) {
    super.changeSelection(row, column, toggle, extend);
    if (editCellAt(row, column)) {
        Component editor = getEditorComponent();
        editor.requestFocusInWindow();
        if (editor instanceof JFormattedTextField) {
            ((JFormattedTextField) editor).select(0,
                    ((JFormattedTextField) editor).getText().length());
        } else if (editor instanceof JTextField) {
            ((JTextField) editor).selectAll();
        }
    }
}

在阅读了大量文档和帖子后,很明显解决问题的最合适的方法是通过使用键绑定,基本上在阅读之后,解决方案是分配{{的行为1}} Tab键的键,所以我做了。

Enter

正如您在代码部分中看到的那样,他们被分配到private void tableConfiguration() { //Configuramos la tabla para que en el caso de que pierda el foco finalice la edición putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); //Cambiamos el comportamiento por defecto de la tecla enter para que actue como TAB getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) .put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "selectNextColumnCell"); // cambiamos Shift+Enter para que se comporte como Shift+Tab getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) .put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_MASK), "selectPreviousColumnCell"); //configuramos el comportamiento por defecto que queremos que tenga nuestro grid setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//seleccion simple de celda setCellSelectionEnabled(true);//muestra la celda activa seleccionada getTableHeader().setReorderingAllowed(false);//no permite reordenar por columnas setRowHeight(26);//altura de la fila } Enter Shift+Enter Tab个键的行为。

我遇到的问题是Shift+Tab密钥有意外行为。当单元格获得焦点时,直接进入编辑模式,当我按下Enter键完成编辑但它没有将焦点转移到下一个单元格时,我需要再次按下Enter得到这个的关键。 EnterTab键按预期工作,好奇,Shift+Tab键效果也很好,完成编辑,移至上一个单元格并以编辑模式开始。< / p>

我试图按照不同的策略纠正这种行为,覆盖JTable类的方法Shift+Enter,通过editingStopped类,使用不同方式的监听器等,我无法做到纠正这种行为让我现在陷入困境。有人有建议或解决方案吗?我做错了什么?

问候,

1 个答案:

答案 0 :(得分:2)

如图here所示,您可以获取与Action相关联的原始"selectNextColumnCell"的引用,该editingStopped()通常与 Tab 相关联,并在您对import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.event.ChangeEvent; public class TestTableKeyBinding { private final String name = "selectNextColumnCell"; public static void main(String[] args) { EventQueue.invokeLater(() -> { new TestTableKeyBinding(); }); } TestTableKeyBinding() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String[] headers = new String[]{"apples", "bananas"}; String[][] data = new String[][]{{"1", "2"}, {"3", "4"}, {"5", "6"}}; JTable table = new JTable(data, headers) { @Override public void editingStopped(ChangeEvent e) { super.editingStopped(e); this.getActionMap().get(name).actionPerformed( new ActionEvent(this, ActionEvent.ACTION_FIRST, name)); } }; table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) .put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), name); table.setCellSelectionEnabled(true); f.add(new JScrollPane(table)); f.pack(); f.setSize(new Dimension(320, 240)); f.setLocationRelativeTo(null); f.setVisible(true); } } 的实施。下面的简化示例还将操作与按 Enter 相关联。结果是按 Enter 将与按 Tab 具有相同的效果,即使按键也结束编辑。

{{1}}