2016-05-18 70 views
0

所以我是編程新手,我一直在製作一個在JFrame和其他JPanel上使用多個JPanel的程序。我使用CardLayout在不同的JPanel之間進行切換,並且我在兩個不同的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的與Button:

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

這裏的地方按鈕使用JPanels:

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

在這段代碼中發生了很多事情,這些事情並不完全正確,它們會對您的問題做出貢獻。因此,讓我們解決最大的問題,然後您將需要自己完成剩下的工作。

首先編輯這段代碼有一些調試文本:

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

現在,當你運行你的代碼,你會發現,消息「ConfirmButtonListener觸發」永遠不會被打印到控制檯,這意味着代碼從不運行,所以你永遠不能回到主屏幕。

發生這種情況是因爲您在ElephantCare類中創建了名稱爲staffConfirmStaffConfirmPanel。然後你添加一個動作監聽器到staffConfirm。問題在於,您從不在任何地方使用該面板,因爲您在Staff1PanelStaff2Panel之內創建了一個新的StaffConfirmPanel,因此您所做的動作偵聽器將不會執行任何操作。

因此,解決辦法是將整個ConfirmButtonListener方法和staffConfirm.getConfirmButton().addActionListener線移動到StaffConfirmPanel類,像這樣:

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作爲公共變量。

相關問題