2011-01-24 3 views
9

Я пытаюсь добавить слушателя клавиш, который содержит JTabbedPane.
Он должен переключать вкладки при получении ctrl + tab.
Но событие с нажатой клавишей никогда не отправляется. Я попытался добавить его к панели и к вкладке объекта - но без успеха.JPanel keylistener

Вот мой код

SwitchTabsListener ctrlTabListener = new SwitchTabsListener(genericTabbedPanel); 
jMainFrame.addKeyListener(ctrlTabListener); 
genericTabbedPanel.addKeyListener(ctrlTabListener); 

ответ

15

Типичным способом ваше ключевое событие не перехватывается правильным компонентом Swing. Вы должны понимать, что первый компонент под курсором получит событие клавиатуры. Если бы вы выбрали кнопку с клавиатурой, это был бы JButton, который получит ключевое событие.

Чтобы убедиться, что вы получаете все эти события, вам не нужно регистрироваться на компонентах, а используйте KeyboardFocusManager, которые будут получать ключевые события, где бы они ни происходили.

Ваш код, то необходимы следующие элементы

KeyEventDispatcher myKeyEventDispatcher = new DefaultFocusManager(); 
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(myKeyEventDispatcher); 

myKeyEventDispatcher затем будет принимать вызовы dispatchKeyEvent всякий раз, когда клавиша нажата, везде, где он находится в пользовательском интерфейсе. Таким образом, вы можете убедиться, что ваш код правильно вызван.

Альтернативный метод регистрации прослушивателя клавиш потребует от вас использовать HierarchyListener для добавления вашего слушателя ключей: удаляется каждый компонент качания, который, как представляется, добавляется/удаляется как дочерний элемент вашего корневого компонента. Это не только громоздко писать, но и очень сложно отлаживать и понимать.

Вот почему я предпочитаю более грубую силу, но, хотя и довольно элегантный способ добавления приложения глобального прослушивателя ключей к определенному менеджеру фокуса клавиатуры.

+0

Спасибо человеку. работает. это грубая сила. – Jeb

+0

KeyboarFocusManager.getCurrentKeyboardFocusManager() - Вы набрали KeyboarFocus ..., но нет никакой «D» (vaild: Keyboard). – barwnikk

2

Это должно работать. Вероятно, это не сработает, потому что

  1. Вы не выбираете правильное окно.
  2. другой компонент ловит это событие.

Вот код, который я вам написал.

public class Test { 

    public static void main(String[] args) throws InterruptedException { 
     JFrame f = new JFrame("aaaa"); 
     f.setSize(100, 100); 
     f.setLocation(100, 100); 
     JPanel p = new JPanel(); 
     f.add(p); 

     f.addKeyListener(new KeyAdapter() { 
      public void keyPressed(KeyEvent e) { 
       System.out.println("pressed"); 
      } 
     }); 

     p.addKeyListener(new KeyAdapter() { 
      public void keyPressed(KeyEvent e) { 
       System.out.println("pressed"); 
      } 
     }); 
     f.setVisible(true); 

    } 

Он отлично работает. Попробуйте сыграть с ним и понять, в чем разница между вашим и моим кодом. Если вы терпите неудачу, пришлите нам более подробный фрагмент кода.

+0

Основная вещь - он хочет захватить 'ctrl + tab' –

+1

Я не уверен, человек. Но, возможно, вы правы. Во всяком случае, e.getKeyCode() и e.getModifiers() могут помочь – AlexR

3

Ctrl+Tab и Ctrl+Shift+Tab позволит вам цикл с помощью вкладок по умолчанию в ОС Windows LookAndFeel:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
+0

просто попробовал, и он не работал для меня. Прости. – Jeb

1

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

import java.awt.KeyboardFocusManager; 
import java.awt.KeyEventDispatcher; 
import java.awt.event.KeyEvent; 
import javax.swing.JFrame; 

public class Exit { 
    public static void main(String[] args) { 
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new ExitKeyEventDispatcher()); 
     JFrame frame = new JFrame(); 
     frame.setBounds(50, 50, 200, 200); 
     frame.setVisible(true); 
    } 
} 
class ExitKeyEventDispatcher implements KeyEventDispatcher { 
    public boolean dispatchKeyEvent(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { 
      System.exit(0); 
      e.consume(); 
     } 
     return false; 
    } 
} 
+1

Чтобы определить, произошло ли событие от нажатия клавиши или отпускания ключа, выполните 'e.getID() == KeyEvent.KEY_RELEASED'. – Emd4600

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