2

私のアプリケーションは小型双発機で使用されます。環境は「でこぼこ」で、乳首の「ねずみ」は非常に使いにくい (ハンガーに入れても!)。少なくとも、ユーザーが実行したい一般的に使用されるすべてのアクションのキーの組み合わせをインターセプトできる必要があります。これらには、たとえば、aa キャリブレーションを実行するためのalt-C 、データの記録を開始するためのalt-R、アプリを正常にシャットダウンするためのalt-Xなどが含まれます。

キー バインディングはデモ クラスでしか使用したことがなく、ウィンドウ全体でキー バインディングを使用する方法がわかりません。JFrame の ContentPane に、他の JPpanel とコンポーネントを含む 5 つの JPanel を配置しました。私が見つけたすべての例は、いくつかのコンポーネントにフォーカスがあることを前提としていますが、コンポーネントに到達するために TAB を 23 回押すことは不合理です。

アプリは LINUX、おそらく Ubuntu で動作します。

4

2 に答える 2

4

Swing では、KeyStroke をメイン パネルのアクション マップに追加する必要があります。たとえば、次のコードを使用すると、[F10] キーを押すたびに、JPanel を含む JFrame を更新できます。

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で動作しています。

于 2012-08-21T21:48:42.043 に答える
2

あなたは試すことができます

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

また

getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

私はおそらくこれをカスタムコンテンツペインで確立します

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

または、ルート ペインの入力マップを使用します

これでうまくいかない場合は別の方法がありますが、まずはこれがうまくいくかどうかを確認したいと思います

于 2012-08-21T21:40:55.020 に答える