2012-08-21 2 views
1

Мое приложение будет использоваться на небольшом самолете с двойным двигателем. Окружающая среда «ухабистая», а «мышь» соска очень сложна в использовании (даже в вешалке!). Мне нужно уметь перехватывать комбинации клавиш, по крайней мере, для всех часто используемых действий, которые пользователь хочет предпринять. Они будут включать в себя, например, альт-C для выполнения калибровки аа, альт-R начать запись данных, альт-X, чтобы приложение закрыли изящно и т.д.Java Как перехватывать комбинации клавиш в любом месте окна с помощью привязок клавиш

Я только использовали ключевые привязки в демонстрационном классе и не понимали, как использовать их во всем окне. Я поставил 5 JPanels, содержащих другие JPpanels и компоненты на моей контентной панели JFrame. Все примеры, которые я нашел, предполагают, что некоторые компоненты имеют фокус, но нажатие TAB 23 раза, чтобы получить компонент, необоснованно.

Приложение будет работать под LINUX, возможно, Ubuntu.

ответ

3

В качели вы должны добавить KeyStroke к карте действий главной панели: например, следующий код позволяет вам обновить JFrame, который содержит JPanel, каждый раз, когда вы нажимаете клавишу [F10]:

public class MainWindow extends JFrame{ 
    JPanel central; 

    public MainWindow(){ 
     central = new JPanel(); 
     // I assume you define your other 5 panels here 
     // and add them to the central JPanel. 
     getContentPane().add(central, BorderLayout.CENTER); 
     registerRefreshAction(); 
    } 

    private void registerRefreshAction(){ 
     javax.swing.Action refresh = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       JFrame frame = (JFrame) getTopLevelAncestor(); 
       frame.setVisible(false); 
       frame.getContentPane().repaint(); 
       frame.setVisible(true); 
      } 
     }; 
     KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0); 
     central.getActionMap().put("Refresh", refresh); 
     central.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "Refresh"); 
    } 
} 

вы должны назвать registerRefreshAction в каком-то месте в конструкторе, как было показано ранее. Остальные компоненты, которые вы упомянули, включены в 5 панелей и не должны отображаться. Он работает в Linux.

+0

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

+0

Я отредактировал исходный код, чтобы показать более реалистичный образец. Конечно, если вы определяете основную панель в другом контейнере и добавляете к ней другие 5 панелей, вы можете зарегистрировать KeyStrokes на карте действий этой панели. – gersonZaragocin

+0

Благодарим вас, это удивительно, насколько очевидны некоторые вещи, когда они указаны! AFAIK он работает отлично. –

2

Вы можете попробовать

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 

или

getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 

я бы, вероятно, это установить на панели пользовательского контента

JPanel myContentPane = new JPanel(); 
frame.setContentPane(myContentPane); 

Или использовать входной карту базовой панели

I f это не работает, есть другой метод, но я бы предпочел посмотреть, работает ли это сначала

+0

Я уверен, что я знал, что у меня возникнет эта проблема, прежде чем я приступим к разработке моего графического интерфейса. Все, что у меня есть, это contentpane с 5 панелями на нем, но множество кнопок и вещей на этих панелях. –