2017-01-21 8 views
0

Прошу прощения, если раньше был дан ответ, я попытался найти решение, но я не смог найти ничего подходящего. Я новичок в этом, поэтому есть шанс, что я полностью упустил или проигнорировал что-то, что привело бы меня к простому решению.Swing JTable - Использование привязки клавиш вместо KeyListener по клавише Shift

Я реализовал прослушиватель клавиш для клавиши shift, так что, когда пользователь нажимает shift, он вводит ячейку ровно в одну строку перед редактированием (см. Код ниже). Хотя есть одна проблема; Если пользователь в данный момент вводит данные в ячейку, клавиша сдвига не работает, и при отладке мы видим, что программа никогда не входит в прослушиватель клавиш. Мне было сказано использовать ключевое связывание вместо ключевых слушателей, чтобы исправить эту проблему. Я попытался выполнить некоторые обучающие онлайн, и похоже, что я потерпел неудачу. Любая помощь будет очень признательна, спасибо много!

Два ключевых слушателей (вкладка работает отлично, а сдвиг не делает):

table.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyReleased(KeyEvent e) { 
      //KeyCode 9 is a key code for the Tab key 
      if (e.getKeyCode() == 9) { 
       if(table.isCellEditable(table.getSelectedRow(),table.getSelectedColumn())) { 
        table.editCellAt(table.getSelectedRow(), table.getSelectedColumn()); 
       } else { 
        table.editCellAt(table.getSelectedRow(), table.getSelectedColumn() + 1); 
       } 
      } 
      //The problem occurs here 
      //KeyCode 16 is a key code for the Shift key 
      if (e.getKeyCode() == 16) { 
       if(table.isCellEditable(table.getSelectedRow() + 1, table.getSelectedColumn())) { 
        table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn()); 
        table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn()); 
        table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1); 
       } else { 
        table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn() + 1); 
        table.setColumnSelectionInterval(table.getSelectedColumn() + 1, table.getSelectedColumn() + 1); 
        table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1); 
       } 

      } 
     } 
    }); 

Вот моя попытка (и не удалось) решение:

class ShiftAction extends AbstractAction{ 
     public void actionPerformed(ActionEvent ae){ 
      System.out.println("Shift"); 
      table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn()); 
      table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn()); 
      table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1); 
     } 
    } 
    shiftAction = new ShiftAction(); 
    table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT,KeyEvent.SHIFT_DOWN_MASK),"doShiftAction"); 
    table.getActionMap().put("doShiftAction",shiftAction); 

Надеюсь, вопрос не слишком глуп, и когда-то снова, спасибо заранее.

+0

«Мне было сказано использовать привязку клавиш вместо ключевых слушателей, чтобы исправить эту проблему».: Who who ?? попросите их. это не исправит вашу проблему, но увеличит ваши проблемы (как вы правильно видите сейчас) – gpasch

+0

Мне сказал это мой преподаватель Java, у которого не так много времени, чтобы помочь мне (у меня осталось еще несколько дней до Я должен закончить проект). Это не такая уж большая сделка, я могу оставить ее как есть, это больше для меня опыт обучения. –

+0

@gpasch, да, Key Bindings - лучшее решение. Это новейший и лучший API и решает проблему фокуса. – camickr

ответ

1
e.getKeyCode() == 9 

Прежде всего, не используйте магические числа. Люди, читающие код, не знают, что означает «9». Используйте предоставленные поля из API KeyEvent: KeyEvent.VK_???.

Мы видим, что программа никогда не входит в прослушиватель ключей.

Фокус находится на JTextField, который используется как редактор для ячейки, поэтому он получает KeyEvent, а не таблицу.

Мне было предложено использовать привязку клавиш вместо прослушивателей клавиш, чтобы исправить эту проблему.

Вам необходимо использовать соответствующий InputMap. В этом случае он должен быть:

JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 

Прочитайте раздел из свинга учебника по How to Use Key Bindings для получения дополнительной информации.

+0

Прошу прощения, мне жаль, что я не подумал об этом. Код ключа для клавиши Tab - 9, а код клавиши для клавиши Shift - 16. Я немедленно отредактирую информацию. Я попытаюсь применить все это к коду. Мне интересно, в этом случае соответствующий JComponent, это JTable или JTextField? –