2013-11-01 3 views
-1

У меня есть JDialog, который содержит много JTextFields и JLabels и jbutton. Когда какой-либо из этих компонентов (текстовые поля или кнопки) сфокусированы и набирается ESCAPE, я хочу захватить сгенерированный ключевой элемент в родительском JDialog.Как захватить keyEvent на родительском, когда какой-либо ребенок сфокусирован?

Я знаю, что для этого есть ясное решение. Я не могу найти его в сети.

Спасибо!

+0

Пожалуйста, введите код, чтобы мы могли вам помочь. –

ответ

2

Подробнее о key bindings. Попробуйте следующий код он может помочь вам:

public static void main(String[] args) { 

    JFrame f = new JFrame(); 
    JTextField field =new JTextField(); 
    f.getContentPane().add(field,BorderLayout.SOUTH); 

    ((JPanel)f.getContentPane()).getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "doSomething"); 
    ((JPanel)f.getContentPane()).getActionMap().put("doSomething", new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      System.out.println("test"); 
     } 
    }); 
    f.getContentPane().add(new JLabel("1"),BorderLayout.NORTH); 


    f.pack(); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 
} 

Используйте следующее строительство getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) из: компонента содержит (или) компонент, который имеет фокус. Эта карта ввода обычно используется для составного компонента - компонента, реализация которого зависит от дочерних компонентов. (согласно документам)

+0

Да, это правильно. Но как создать KeyStroke для Escape. Потому что я вижу там только F2. –

+0

измените F2 на ESCAPE, и это будет работа! – alex2410

+0

((JPanel) super.getContentPane()). GetInputMap (JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) .put (KeyStroke.getKeyStroke («выпущенный ESCAPE»), «actionOnEscape»); –