2012-02-23 9 views
0

私は問題は何ですか?私はJButtonを使ってcardLayoutでJPanelを拡張し、正しいコードを使用しているのか分かりません... ここに私のコーディングがあります。ここで他のクラスでcardLayoutを実行するためにButton ActionListenerを実装する方法は?

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

はその後、私のOptionPanel、このコードはここにMainPanel

public class OptionPanel extends JPanel{ 

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

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

だから、具体的に何が問題なのですか? – mre

+0

どのように使用しようとしているのか分かりませんが、インスタンス化すると、CardLayoutMenuはMainPanelインスタンスを作成します。 MainPanelは、インスタンス化されると、CardLayoutMenuを作成します。これは、スタックのオーバーフローで終わることができます... – Sebastien

+1

そこに無限回帰の素敵な例! –

答えて

3

を戻ってのJButton jbtBackを使用するには、無限の原因になります私のMainPanel

public class MainPanel extends JPanel{ 

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

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

です再帰:

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

このコンストラクタは、最終的CardLayoutMenuクラスから呼び出されているので、あなたが作成しMainPanelオブジェクトを作成CardLayoutMenuオブジェクトを作成しMainPanelオブジェクトを作成しCardLayoutMenuオブジェクトを作成しMainPanelオブジェクトを作成しCardLayoutMenuオブジェクトを持っていますがa ...まあ、私はあなたが写真を撮ると思う。私は強くあなたに促す

1つの基本的なルールは、あまりにも多くを行うには、クラスを尋ねると、多くの場合、あなたと混乱コードにつながるとして、あなたのGUIクラスは、リスナー・インターフェースを実装しないことです。これは小さなサンプルプログラムでうまくいきますが、初心者がこのようなことをやり続けることを奨励しているので、それが使われていないことを望みます。代わりにActionListenerオブジェクトを作成し、このリスナーを、CardLayoutにビューを変更するように指示する必要がある任意のクラスに渡すことを検討してください。このリスナは、コンストラクタまたはsetterメソッドのパラメータを介してこれらのクラスに渡すことができます。

+0

したがって、CardLayoutMenuクラスで内部クラスのActionListenerを作成し、mainPanelとOptionPanelからJButtonオブジェクトを取得するためにgetButtonObjectコンストラクターを作成する必要があります。 MainPanelとOptionPanelでJButtonのActionListenerをどのように追加すればよいですか? jbtOption.addActionListener(new CardLayoutMenu.ButtonListener()); \ n a – LastKind

関連する問題