2011-12-21 6 views
4

次のコードを使用して、スイングを使用してJavaフォームのホットキーを作成します。 ALT + N、ALT + R、ALT + 1、ALT + 2を押すと、カーソルが正しいテキストフィールドに移動し、対応するテキストフィールドに値を入力します。それは適切に動作します。私の問題は、私は保存し、このフォームでJButtonを終了している場合です。 Ctrl + Sキーを押すと、保存ボタンが同時に選択されます。Ctrlキーを押しながらXキーを押すと、終了ボタンが選択されます。 JButton用のニーモニックの作成方法どのようにCTRL + S、CTRL + Xを行うには、次のコードを使用して?スイングを使用してJavaでJButtonのホットキーを作成

ありがとうございます。

package hotkeys; 
import java.awt.event.*; 
import javax.swing.*; 
import java.net.*; 
public class hotkey extends JFrame { 
    public static void main(String arg[]) { 
     JLabel Name = new JLabel("Name"); 
     JTextField tf1 = new JTextField(20); 
     Name.setLabelFor(tf1); 
     Name.setDisplayedMnemonic('N'); 


     JLabel Regno = new JLabel("RegNO"); 
     JTextField tf2 = new JTextField(20); 
     Regno.setLabelFor(tf2); 
     Regno.setDisplayedMnemonic('R'); 

     JLabel Mark1 = new JLabel("Mark1"); 
     JTextField tf3 = new JTextField(20); 
     Mark1.setLabelFor(tf3); 
     Mark1.setDisplayedMnemonic('1'); 

     JLabel Mark2 = new JLabel("Mark2"); 
     JTextField tf4 = new JTextField(20); 
     Mark2.setLabelFor(tf4); 
     Mark2.setDisplayedMnemonic('2'); 


     JButton b1 = new JButton("Save"); 
     JButton b2 = new JButton("eXit"); 


     JFrame f = new JFrame(); 
     JPanel p = new JPanel(); 

     p.add(Name); 
     p.add(tf1); 
     p.add(Regno); 
     p.add(tf2); 
     p.add(Mark1); 
     p.add(tf3); 
     p.add(Mark2); 
     p.add(tf4); 
     p.add(b1); 
     p.add(b2); 

     f.add(p); 
     f.setVisible(true); 
     f.pack(); 
    } 
} 
+2

してください、あなたはどんな進展せず、他に何が必要か? http:// stackoverflow。com/questions/8586353/create-hot-keys-in-java-using-swing、http://stackoverflow.com/questions/8585544/enter-key-using-in-jtextfield-java、http:// stackoverflowを参照してください。 com/questions/8584998/hotkeys-for-java-swing-form、 – mKorbel

答えて

18

ボタンのコンポーネント入力マップにkeyBindingを登録する必要があります。コードでは(あなたが

// create an Action doing what you want 
Action action = new AbstractAction("doSomething") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("triggered the action"); 
    } 

}; 
// configure the Action with the accelerator (aka: short cut) 
action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control S")); 

// create a button, configured with the Action 
JButton toolBarButton = new JButton(action); 
// manually register the accelerator in the button's component input map 
toolBarButton.getActionMap().put("myAction", action); 
toolBarButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
     (KeyStroke) action.getValue(Action.ACCELERATOR_KEY), "myAction"); 
+0

by anonymous up-voter – mKorbel

9

日は全体のキーバインディング問題の本当に良い説明があります。:-)以前の質問でやるように言われてきたかの微妙なバリエーションを繰り返しますあなたはここでそれを見つけることができます:

JavaSE Tutorial on Keybinding

// EDITあなたはそれを貼り付ける+コピーするだけのことができるように

は私のサンプルコードを編集し、それが動作します。フィードバックに感謝して、欠落していた点が含まれています。

KeyStroke keySave = KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK); 
Action performSave = new AbstractAction("Save") { 
    public void actionPerformed(ActionEvent e) {  
     //do your save 
     System.out.println("save"); 
    } 
}; 
JButton b1 = new JButton(performSave); 
b1.getActionMap().put("performSave", performSave); 
b1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keySave, "performSave"); 

KeyStroke keyExit = KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK); 
Action performExit = new AbstractAction("Exit") { 
    public void actionPerformed(ActionEvent e) {  
     //exit 
     System.out.println("exit"); 
    } 
}; 
JButton b2 = new JButton(performExit); 
b2.getActionMap().put("performExit", performExit); 
b2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyExit, "performExit"); 
+0

良い方向 - ちょっとした不完全さ:さらに、a)ボタンのactionMapでアクションを登録するb)ウィンドウスコープのショートカットが必要な場合は、デフォルト(WHEN_FOCUSED)の代わりにJComponent.WHEN_IN_FOCUSED_WINDOW型の "component inputMap"にkeyStrokeを登録してください – kleopatra

+0

ちょっと気付いたc)アクションはnameプロパティを持つ必要があります(テキストでボタンをインスタンス化するのではなく)設定してください。少しずつ問題を修正したら、今度はdownvoted :-) – kleopatra

+0

フィードバックkleopatraありがとうございます。 :)コピー+貼り付け後に動作するようにコードサンプルを編集しました。良い一日を過ごしてください。 – Matschie

1

コードを変更しました。 Ctrl + Xは編集コマンド "Cut"のショートカットです(Ctrl-C & Ctrl-Vと一緒に)。編集可能なフィールドがフレームにあります。代わりにCtrl-Q(終了)を使用しました。

import java.awt.event.*; 
import java.beans.PropertyChangeListener; 

import javax.swing.*; 
import javax.swing.plaf.ActionMapUIResource; 

import java.net.*; 

public class HotKeys extends JFrame { 
public static void main(String arg[]) { 
    JLabel Name = new JLabel("Name"); 
    JTextField tf1 = new JTextField(20); 
    Name.setLabelFor(tf1); 
    Name.setDisplayedMnemonic('N'); 

    JLabel Regno = new JLabel("RegNO"); 
    JTextField tf2 = new JTextField(20); 
    Regno.setLabelFor(tf2); 
    Regno.setDisplayedMnemonic('R'); 

    JLabel Mark1 = new JLabel("Mark1"); 
    JTextField tf3 = new JTextField(20); 
    Mark1.setLabelFor(tf3); 
    Mark1.setDisplayedMnemonic('1'); 

    JLabel Mark2 = new JLabel("Mark2"); 
    JTextField tf4 = new JTextField(20); 
    Mark2.setLabelFor(tf4); 
    Mark2.setDisplayedMnemonic('2'); 

    JButton b1 = new JButton("Save"); 
    JButton b2 = new JButton("eXit"); 

    JFrame f = new JFrame(); 
    JPanel p = new JPanel(); 

    p.add(Name); 
    p.add(tf1); 
    p.add(Regno); 
    p.add(tf2); 
    p.add(Mark1); 
    p.add(tf3); 
    p.add(Mark2); 
    p.add(tf4); 
    p.add(b1); 
    p.add(b2); 

    // ***************************************************** 
    ActionMap actionMap = new ActionMapUIResource(); 
    actionMap.put("action_save", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Save action performed."); 
     } 
    }); 
    actionMap.put("action_exit", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Exit action performed."); 
     } 
    }); 

    InputMap keyMap = new ComponentInputMap(p); 
    keyMap.put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, 
      java.awt.Event.CTRL_MASK), "action_save"); 
    keyMap.put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, 
      java.awt.Event.CTRL_MASK), "action_exit"); 
    SwingUtilities.replaceUIActionMap(p, actionMap); 
    SwingUtilities.replaceUIInputMap(p, JComponent.WHEN_IN_FOCUSED_WINDOW, 
      keyMap); 
    // ***************************************************** 

    f.add(p); 
    f.setVisible(true); 
    f.pack(); 
} 
} 
+0

@ java872ここにあなたの質問への回答です。http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work/65088#65088 +1 – mKorbel

+0

no-you _never_(読んでください:本当にあなたがそれらのreplaceXXメソッドを使いたいと思っているときを除いて。 a)あなたがJPanelの_all_インスタンスのためのそれらの新しいマップをインストールしてください。b)LAP – kleopatra

+0

の私の最後のコメントに若干の修正が残っていません:XXPanelUIはマップを全くインストールしないので、b) – kleopatra

0

私はこれを他の人と同様に学習経験として提供します。私は過去に発見したキーバインディングのコードスニペットを適用するのが難しかったので、私の説明とコードが明確になることを願っています。彼女のコードスニペットのための@kleopatraのおかげです。

(私がために、より明確に一致しなければならないものを表示しないようにすべきである大文字を使用しています。)

は、コードがgetInputMapとで一致した文字列を使用してMYACTIONためactionPerformedのコードにCtrl-Shift-UキーストロークリンクgetActionMap

下記のMYACTIONの3つのインスタンスは、の2つのインスタンスと同じように、一致する必要があります(MYACTIONBUTTONの4つのインスタンスと一致する必要があります)。あなたのものと呼んでください。それらを一致させるだけです。

ボタンMYACTIONBUTTONはそれを定義JButtonの引数としてMYACTIONを持っている必要があり、getInputMapgetActionMapが適用されている必要があります。

private static JButton MYACTIONBUTTON; 
private static JFrame frame; 
private static JPanel panel; 

...

Action MYACTION = new AbstractAction() 
{ 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     // put action code here 
    } 
}; 

MYACTIONBUTTON = new JButton(MYACTION); 

MYACTIONBUTTON.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 

          .put(getKeyStroke(VK_U, CTRL_DOWN_MASK | SHIFT_DOWN_MASK), 

            "MAKE_THESE_MATCH"); 

MYACTIONBUTTON.getActionMap().put("MAKE_THESE_MATCH",  MYACTION); 

panel.add(MYACTIONBUTTON); 

frame.add(panel); 
関連する問題