2012-02-23 55 views
0

我不是什麼問題?我嘗試通過使用JButton切換兩個獨立的類擴展JPanel與cardLayout,我不知道我使用了正確的代碼... 這是我的代碼。如何實現Button ActionListener來運行其他類的cardLayout?

CardLayoutMenu

public class CardLayoutMenu extends JFrame implements ActionListener{ 

    CardLayout cardLayout = new CardLayout(); 

    private JPanel p1 = new JPanel(cardLayout); 

    final String MAIN = "MAIN"; 
    final String OPTION = "OPTION"; 

    MainPanel mainPanel = new MainPanel(); 
    OptionPanel optionPanel = new OptionPanel(); 

    private Object object; 

    public CardLayoutMenu(Object object) {   
     this.object = object; 
    } 

    public CardLayoutMenu(){ 

     setLayout(new BorderLayout()); 
     setTitle("Card Layout Menu"); 
     setSize(300,300); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
     setLocationRelativeTo(null);    
     add(p1);    
     p1.add(mainPanel, MAIN); 
     p1.add(optionPanel, OPTION); 
    } 

    public void actionPerformed(ActionEvent e){ 

     try{ 
      cardLayout.show(p1, OPTION); 
     }catch(Exception ex){ 
      System.out.println("" + ex); 
     } 
    } 
} 

這裏是我的mainPanel

public class MainPanel extends JPanel{ 

    private JButton jbtOption = new JButton("Option"); 

    public MainPanel() {    
     setLayout(new FlowLayout()); 
     add(jbtOption);   
     jbtOption.addActionListener(new CardLayoutMenu(this)); 
    } 
} 

然後我OptionPanel,使用JButton的jbtBack回去mainPanel中

public class OptionPanel extends JPanel{ 

    private JButton jbtBack = new JButton("Back"); 

    public OptionPanel() {   
     setLayout(new FlowLayout()); 
     add(jbtBack);   
    } 
} 
+1

那麼...具體*是什麼問題? – mre 2012-02-23 13:34:00

+0

我不確定你是如何嘗試使用它的,但是CardLayoutMenu在實例化時創建了一個MainPanel實例。當實例化MainPanel時,創建一個CardLayoutMenu。這隻會導致堆棧溢出...... – Sebastien 2012-02-23 13:41:01

+1

有無限遞歸的好例子! – 2012-02-23 14:08:31

回答

3

這個代碼在這裏會引起無限遞歸:

public MainPanel() { 
    setLayout(new FlowLayout()); 
    add(jbtOption); 
    jbtOption.addActionListener(new CardLayoutMenu(this)); 
} 

由於此構造最終從CardLayoutMenu類調用,你必須創建它創建創建創建將創建它創建一個對象的mainPanel一個CardLayoutMenu對象的mainPanel對象CardLayoutMenu對象的mainPanel對象CardLayoutMenu對象一個......好吧,我想你會得到這張照片。

我強烈要求你的一個基本規則是不要讓你的GUI類實現Listener接口,因爲它要求類做得太多,並且經常導致諸如你的代碼混淆。這在小型示例程序中是很好的,但我希望它不會被使用,因爲它鼓勵新手繼續做這類事情。請考慮創建一個ActionListener對象,並將此偵聽器傳遞給需要按鈕的任何類,該按鈕需要通知CardLayout更改視圖。您可以通過構造函數或setter方法參數將此偵聽器傳遞到這些類中。

+0

所以我必須在CardLayoutMenu類中創建內部類ActionListener,並創建一個構造函數getButtonObject以從MainPanel和OptionPanel獲取JButton對象?那麼我應該如何在MainPanel和OptionPanel中爲JButton添加ActionListener? jbtOption.addActionListener(new CardLayoutMenu.ButtonListener()); \ n a – LastKind 2012-02-25 08:30:10

相關問題