2017-02-18 6 views
0

キーバインディングを使用して2つの方法で切り替える必要があります。ここで私のコードは、それは片方の方法で動作します。誰かが私を両方の方法で動かせるように助けることができますか?キーバインディングを使用した2つのフォーム間の切り替え

public class MyFrame extends JFrame { 
    private FirstForm firstForm = new FirstForm(); 
    private SecondForm secondForm = new SecondForm(); 

    public MyFrame(){ 
     setContentPane(firstForm); 
     setSize(800,600); 
     firstForm.addActionListenerForSomeAction(switcher(secondForm)); 
     secondForm.addActionListenerForSomeAction(switcher(firstForm)); 

     keyboardSwitcher(firstForm); 
     keyboardSwitcher(secondForm); 

    } 

    public void keyboardSwitcher(JPanel panel){ 

     InputMap imap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     imap.put(KeyStroke.getKeyStroke("ctrl ENTER"),"switchAction"); 

     ActionMap amap = getRootPane().getActionMap(); 
     amap.put("switchAction",switcher(panel)); 
    } 

    public Action switcher(JPanel panel){ 
     Action action = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       setContentPane(panel); 
       getContentPane().revalidate(); 
       getContentPane().repaint(); 
      } 
     }; 
     return action; 
    } 
} 

FirstFormSecondFormJPanelを拡張する私自身のクラスです。

+1

1)を使用し[ 'CardLayout'(http://download.oracle.com/javase/8/docs/api/java/awt/CardLayout.html)に示すように、この回答(HTTP:/ /stackoverflow.com/a/5786005/418556)。 2)すぐに助けを得るために、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –

+0

ありがとうございます。それは私の最初の投稿です、私は将来あなたの指導を使用します – Arseniy

+0

* "私はあなたの指導を将来的に使用する" *クール。その場合、私は将来あなたの質問にもっと入れてもいいかもしれません。もちろん、あなたは今質問を編集するかもしれません。* –

答えて

1

あなたkeyboardSwitcher(...)メソッドは間違っています。 2回目にメソッドを呼び出すと、最初のバインドを置き換えるだけです。同じKeyStrokeに対して2つのバインディングを設定することはできません。

あなたは正しくメソッドにJPanelのを渡すが、その後、あなたはキーバインディングを設定するためのJPanelを使用することはありません。

ので、代わりのあなたが個別に各パネル上のバインディングを設定する必要がルート区画にバインディングを設定します。あなたはCardLayout使用しなければならないのパネルを交換するために、また

InputMap im = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 

は、次のInputMapを使用します。このレイアウトマネージャでは、CardLayoutに追加された複数のパネルを交換することができます。実際の例については、How to Use CardLayoutのSwingチュートリアルのセクションを参照してください。あなたのスイッチャーアクションを作成するときに

は今、あなたはまた、あなたがに切り替えたいパネルの名前を知っておく必要があります。

+0

あなたの答えをありがとう。私は2つの方法(Ctrlキーを押しながら)キーバインディングを介して2つのフォームを切り替えるタスクを持っている入力/アクションマップでGridBagLayoutとRootPaneを使用する必要がありますか? – Arseniy

+0

@Arseniy、私はすでに、同じKeyStrokeに対して複数のバインディングを持つことはできないと提案しました。バインドをルートペインに追加する場合は、バインディングを1つしか使用できません。私はCardLayoutを使うと 'next(...)'メソッドを使うことができると思います。他のパネルにスワップします。アクションはよりスマートにする必要があります。アクションは、現在表示されているパネルを認識してから、もう一方のパネルを表示する必要があります。子パネルは、必要なレイアウトを使用できます。親パネルはCardLayoutを使用します。チュートリアルを読んで、サンプルをダウンロードし、デモコードを使ってコンセプトを理解してください! – camickr

+0

今私は理解しています、ありがとう – Arseniy

関連する問題