2017-02-18 94 views
0

我需要使用密鑰綁定以兩種方式切換。這是我的代碼,它有一種方法。有人可以幫助我使它工作嗎?使用密鑰綁定在兩個窗體之間切換

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; 
    } 
} 

FirstFormSecondForm是我自己的類擴展JPanel

+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(...)方法是錯誤的。第二次調用該方法時,您只是替換第一個綁定。對於相同的KeyStroke,您不能有兩個綁定。

您正確地將JPanel傳遞給方法,但是您從不使用JPanel來設置鍵綁定。

因此,不需要在根窗格上設置綁定,而需要分別在每個面板上設置綁定。

您可以使用下面的InputMap:

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

此外,換你應該使用一個CardLayout面板。此佈局管理器將允許您在添加到CardLayout的多個面板之間進行交換。查看How to Use CardLayout的Swing教程中的部分,以獲得一個工作示例。

現在,當您創建切換器操作時,您還需要知道要切換到的面板的名稱。

+0

謝謝你的回答。我有兩種方式通過KeyBindings在兩種方式下切換任務(按Ctrl鍵)我需要在輸入/動作映射中使用GridBagLayout和RootPane,它是否可行? – Arseniy

+0

@Arseniy,我已經建議你不能有相同的KeyStroke多個綁定。它要將綁定添加到根窗格,那麼您只能有一個綁定。我想如果你使用CardLayout,你可以使用'next(...)'方法。交換到其他面板。行動將需要更聰明。該操作需要知道哪個面板當前可見,然後顯示其他面板。子面板可以使用你想要的佈局。父面板使用CardLayout。閱讀教程,下載示例並使用演示代碼來理解概念! – camickr

+0

現在我明白了,非常感謝你 – Arseniy