2012-02-23 5 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); 
     } 
    } 
} 

그런 다음 내 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, 무한의 원인이됩니다 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을 사용하는 것입니다 재귀 :

이 생성자는 궁극적으로 CardLayoutMenu 클래스에서 호출되기 때문에
public MainPanel() { 
    setLayout(new FlowLayout()); 
    add(jbtOption); 
    jbtOption.addActionListener(new CardLayoutMenu(this)); 
} 

, 당신은 생성하는 MainPanel 객체를 생성하는 CardLayoutMenu 객체를 생성하는 MainPanel 객체를 생성하는 CardLayoutMenu 객체를 생성하는 MainPanel 객체를 생성하는 CardLayoutMenu 개체를해야합니다 나는 ... 네가 그림을 얻은 것 같아.

하나의 기본 규칙 저는 GUI 클래스가 리스너 인터페이스를 구현하지 않도록 강력히 권고합니다. 클래스가 너무 많이하도록 요청하고 종종 당신과 같은 혼동을 일으키는 코드로 이어지게합니다. 이것은 작은 예제 프로그램에서 일종의 괜찮 았지만, 나는 그것이 초보자들이 이런 종류의 일을 계속하도록 격려하면서 사용되지 않았기를 바란다. 대신 ActionListener 객체를 만들고이 청취자를 CardLayout에보기를 변경하도록 지시해야하는 버튼이 필요한 모든 클래스에 전달하는 것을 고려하십시오. 이 리스너는 생성자 또는 setter 메서드 매개 변수를 통해 이러한 클래스에 전달할 수 있습니다.

+0

그래서 CardLayoutMenu 클래스에서 내부 클래스 ActionListener를 만들고 MainPanel 및 OptionPanel에서 JButton 객체를 가져 오기 위해 getButtonObject 생성자를 만들어야합니다. ?? 그런 다음 MainPanel 및 OptionPanel에 JButton에 대한 ActionListener를 어떻게 추가해야합니까 ?? jbtOption.addActionListener (new CardLayoutMenu.ButtonListener()); \ n a – LastKind

관련 문제