1

JTableキーを押すと、現在の行の3番目の列の編集をプログラムで開始しようとしています。

keyReleased()このコードを含むKeyListenerを実装しました

if (e.getKeyCode() == KeyEvent.VK_ENTER)
{
    myTab.changeSelection(myTab.getSelectedRow(), 2, true, false);
    myTab.editCellAt(myTab.getSelectedRow(), 2);
}

Enterキーを離すと、セルは実際に編集可能です(最後に入力できます)が、注意点はありません。

マウスでクリックすると、期待どおりの動作になります(編集可能で、キャレットが存在します)。

また、keyreleaseでは、celleditorがnullであり、mouseclickではnullではないことに気づきました。

私は何が間違っているのですか?

4

1 に答える 1

7

避けKeyListenerてください。フォーカスとイベントがディスパッチされる順序に関しては信頼できません(リスナーの前にキーが消費される可能性があるため、通知されることはありません)。

代わりにキーバインディングを使用してください

InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = table.getActionMap();

KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);

im.put(enterKey, "Action.enter");
am.put("Action.enter", new AbstractAction() {
    public void actionPerformed(ActionEvent evt) {
        table.changeSelection(table.getSelectedRow(), 2, false, false);
        if (!table.editCellAt(table.getSelectedRow(), 2)) {
            JOptionPane.showMessageDialog(table, "Failed to start cell editing");
        }
    }
});

私もこのmyTab.changeSelection(myTab.getSelectedRow(), 2, true, false);呼びかけに疑いを持っています。JavaDocsは基本的に...

トグル:true、拡張:false。指定したセルが選択されている場合は、選択を解除します。選択されていない場合は選択してください。

これは、セルが現在選択されている場合、選択解除されることを示唆しています。

実例で更新

public class TestTableEditor {

    public static void main(String[] args) {
        new TestTableEditor();
    }

    private JTable table;

    public TestTableEditor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                table = new JTable(new MyTableModel());
                InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
                ActionMap am = table.getActionMap();

                KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);

                im.put(enterKey, "Action.enter");
                am.put("Action.enter", new AbstractAction() {
                    public void actionPerformed(ActionEvent evt) {
                        table.changeSelection(table.getSelectedRow(), 1, false, false);
                        if (!table.editCellAt(table.getSelectedRow(), 1)) {
                            JOptionPane.showMessageDialog(table, "Failed to start cell editing");
                        }
                    }
                });

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MyTableModel extends AbstractTableModel {

        @Override
        public int getRowCount() {
            return 1;
        }

        @Override
        public int getColumnCount() {
            return 3;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Object value = null;
            switch (columnIndex) {
                case 0:
                    value = "Can't edit";
                    break;
                case 1:
                    value = "Edit me";
                    break;
                case 2:
                    value = "Can't edit";
                    break;
            }
            return value;
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return columnIndex == 1;
        }
    }
}

更新しました

すべての愚かな、痛みを伴う、見つけるのが難しい...

コードに追加table.setSurrendersFocusOnKeystroke(true);...

JTableがセルのキーボードイベントを転送した結果としてエディターがアクティブ化されたときに、このJTableのエディターがキーボードフォーカスを取得するかどうかを設定します。デフォルトでは、このプロパティはfalseであり、セルがクリックされない限り、JTableはフォーカスを保持します。

于 2013-01-08T00:31:59.137 に答える