2016-05-18 18 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作为公共变量。

相关问题