2014-09-08 2 views
1

Что является самым простым и самым быстрым способом для удаления стандартного ввода привязок клавиш (нажатие enter выбирает следующую строку) в JTable?Удалить Введите привязку клавиш в JTable

Вот что я пытался

table.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), null); 

Но это не работает. Я предполагаю, что мы должны сделать это как-то для каждой ячейки, а не самой таблицы.

ответ

3

JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT и JComponent.WHEN_IN_FOCUSED_WINDOW имеют значение для ввода ввода. Итак, вы хотите, чтобы получить их обоих

Исправление: Вам нужно получить InputMap для WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

InputMap iMap1 = 
     table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
//InputMap iMap2 = 
     // table.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 

Затем вы хотите, чтобы установить значение для отображения на "none", вместо null, как описано в How to Use Key Bindings.

Чтобы компонент игнорировал ключ, на который он обычно отвечает, вы можете использовать специальное действие «none». Например, следующий код заставляет компонент игнорировать клавишу F2.

component.getInputMap().put(KeyStroke.getKeyStroke("F2"), "none");

Так просто сделать:

KeyStroke stroke = KeyStroke.getKeyStroke("ENTER"); 
iMap1.put(stroke, "none"); 
//iMap2.put(stroke, "none"); 

Кроме того, обратите внимание, когда вы просто делаете getInputMap() без каких-либо аргументов, это в основном то же самое, как getInputMap(JComponent.WHEN_FOCUSED). И в случае JTable нет значения для ввода ввода для этого InputMap.

Подробнее на How to Use Key Bindings.Вы получите лучшее объяснение различных InputMaps


UPDATE: Исправление (исправления, сделанные выше либо зачеркнут// commented out или)

Вы только установить его для InputMap для JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT


ОБНОВЛЕНИЕ за OP co Закоментировать: Да короче

table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) 
          .put(KeyStroke.‌​getKeyStroke("ENTER"), "none"); 
+1

Подводя итог: 'table.getInputMap (JComponent. WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) .put (KeyStroke.getKeyStroke ("ENTER"), "none"); 'выполняет задание. Благодаря! –

0

Update:
Дэвид Kroukamp решение:

private void createKeybindings(JTable table) { 
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Enter"); 
    table.getActionMap().put("Enter", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent ae) {} 
    }); 
} 

И для вас должно быть достаточно:

table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Enter"); 
table.getActionMap().put("Enter",null); 

Я не знаю, если это возможно, использовать null, вы можете использовать анонимный класс вместо ...

+0

Это также Безразлично» т работы. –

+0

Попробуйте 'Action' вместо' Input' – maskacovnik

+0

Опять никакого эффекта. –

1

Это, кажется, самый удобный способ:

table.registerKeyboardAction(
    null, 
    KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), 
    JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 
); 

Чтобы назначить действие заменить null с ActionListener вызова или e -> someMethod() для JDK 1.8

+0

Ваш ответ - вот что мне нужно спасибо – Cherif

Смежные вопросы