2016-05-18 2 views
0

私はプログラミングが初めてで、JFrameや他のJPanelで複数のJPanelを使用するプログラムを作成しています。私はCardLayoutを使って別のJPanel間を行き来していますが、2つの異なるJButtonで作業していますが、最後のものをメイン画面に戻すことはできません。CardLayoutを使用している間、カード間で移行しないJButton

私は答えを探しましたが、ほとんどの人が私がやったことを知っているActionListenerを使用することを忘れているようです。ここに私のコードに含まれるいくつかのクラスがあります(たくさんありますので、それらをすべて含めませんが、私は必要なものを提供できます)。ここで

はJFrameのクラスがあります:ここでは

import javax.swing.*; 

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.event.*; 

public class ElephantCare extends JFrame { 
private static final long serialVersionUID = 1L; 

private final String MAIN_STRING = "Main"; 
public JPanel container, main; 
private Staff1Panel staff1 = new Staff1Panel(); 
private Staff2Panel staff2 = new Staff2Panel(); 
private StaffConfirmPanel staffConfirm = new StaffConfirmPanel(); 
private WelcomePanel welcome = new WelcomePanel(); 
private StaffPanel staff = new StaffPanel(); 
private GallonsPanel gallons = new GallonsPanel(); 
private ToysPanel toys= new ToysPanel(); 
private ActionPanel action = new ActionPanel(); 
public CardLayout card = new CardLayout(); 

public ElephantCare() { 
    setSize(400,300); 
    setTitle("Elephant Care"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    buildPanel(); 
    add(container); 
    setVisible(true); 
} 

private void buildPanel() { 
    main = new JPanel();; 
    container = new JPanel(card); 
    container.add(main, MAIN_STRING); 
    container.add(staff1, "Staff 1"); 
    container.add(staff2, "Staff 2"); 

    main.setLayout(new BorderLayout()); 

    main.add(welcome, BorderLayout.NORTH); 
    main.add(staff, BorderLayout.WEST); 
    main.add(gallons, BorderLayout.CENTER); 
    main.add(toys, BorderLayout.EAST); 
    main.add(action, BorderLayout.SOUTH); 

    staff.getStaff1Button().addActionListener(new Staff1Listener()); 
    staff.getStaff2Button().addActionListener(new Staff2Listener()); 
    staffConfirm.getConfirmButton().addActionListener(new ConfirmButtonListener()); 
} 

private class Staff1Listener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     card.show(container, "Staff 1"); 
    } 
} 

private class Staff2Listener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     card.show(container, "Staff 2"); 
    } 
} 
private class ConfirmButtonListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     card.show(container, MAIN_STRING); 
    } 
} 

}

はボタンでのJPanelです:

import javax.swing.*; 

public class StaffConfirmPanel extends JPanel{ 
    private static final long serialVersionUID = 1L; 
    public JButton confirm; 

    public StaffConfirmPanel() { 

     confirm = new JButton("OK"); 

     add(confirm); 
    } 

    public JButton getConfirmButton() { 
     return confirm; 
    } 
} 

そして、ここではボタンが使用されているのJPanelです:

import java.awt.BorderLayout; 

import javax.swing.*; 

public class Staff1Panel extends JPanel{ 
    private static final long serialVersionUID = 1L; 
    private Staff1NamePanel name = new Staff1NamePanel(); 
    private Staff1JobPanel job = new Staff1JobPanel(); 
    private StaffConfirmPanel confirm = new StaffConfirmPanel(); 

    public Staff1Panel() { 
     setLayout(new BorderLayout()); 

     add(name, BorderLayout.WEST); 
     add(job, BorderLayout.EAST); 
     add(confirm, BorderLayout.SOUTH); 
    } 
} 

その他:

import java.awt.BorderLayout; 

import javax.swing.*; 

public class Staff2Panel extends JPanel{ 
    private static final long serialVersionUID = 1L; 
    private Staff2NamePanel name = new Staff2NamePanel(); 
    private Staff2JobPanel job = new Staff2JobPanel(); 
    private StaffConfirmPanel confirm = new StaffConfirmPanel(); 

    public Staff2Panel() { 
     setLayout(new BorderLayout()); 

     add(name, BorderLayout.WEST); 
     add(job, BorderLayout.EAST); 
     add(confirm, BorderLayout.SOUTH); 
    } 
} 

ありがとうございました!

答えて

2

このコードでは、うまくいかないことがたくさんあり、問題に寄与しています。したがって、アドレスを最大の問題とし、残りの部分を自分で処理する必要があります。今、あなたはあなたがコードすることを意味し、メッセージがコンソールに出力されることはありません「ConfirmButtonListenerがトリガされた」ことに気づくでしょう、あなたのコードを実行したときに

private class ConfirmButtonListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     //NEW LINE OF CODE 
     System.out.println("ConfirmButtonListener was triggered"); 
     card.show(container, MAIN_STRING); 
    } 
} 

最初の編集このコードは、いくつかのデバッグテキストを持っています実行されないので、メイン画面に戻ることはできません。

これは、クラスにstaffConfirmという名前のStaffConfirmPanelを作成したためです。次に、アクションリスナーをstaffConfirmに追加します。問題は、staffconfirmパネルをどこにも使用しないことです。新しいStaffConfirmPanelStaff1PanelStaff2Panelの中に作成するので、作成したアクションリスナーは何も行いません。

だから、解決策はそうのようStaffConfirmPanelクラスに全体ConfirmButtonListener方法とstaffConfirm.getConfirmButton().addActionListenerラインを移動することです:

import javax.swing.*; 

public class StaffConfirmPanel extends JPanel{ 
    private static final long serialVersionUID = 1L; 
    public JButton confirm; 

    public StaffConfirmPanel() { 

     confirm = new JButton("OK"); 

     add(confirm); 

     //NEW LINE: SET THE ACTION LISTENER 
     confirm.addActionListener(new ConfirmButtonListener()); 
    } 

    public JButton getConfirmButton() { 
     return confirm; 
    } 

    //NEW CODE, MOVE THE ACTION LISTENER METHOD HERE 
    //ACTION LISTENER MOVED HERE 
    private class ConfirmButtonListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      //NEW LINE OF CODE 
      System.out.println("ConfirmButtonListener was triggered"); 
      card.show(ElephantCare.container, ElephantCare.MAIN_STRING); 
     } 
    } 
} 

今では正常に動作し、メイン画面に戻ります。

編集:ElephantCareクラスの公開変数をMAIN_STRINGにする必要があります。

関連する問題