【问题标题】:JButton that won't transition between Cards while using CardLayout使用 CardLayout 时不会在卡片之间转换的 JButton
【发布时间】:2016-05-18 21:38:08
【问题描述】:

所以我是编程新手,我一直在制作一个在 JFrame 和其他 JPanel 上使用多个 JPanel 的程序。我正在使用 CardLayout 在不同的 JPanel 之间切换,我让它在两个不同的 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);
    }
}

感谢您的帮助!

【问题讨论】:

    标签: java jbutton cardlayout


    【解决方案1】:

    这段代码中发生了很多不完全正确的事情,它们会导致您的问题。因此,让我们解决最大的问题,然后您需要自己做其余的事情。

    首先编辑这段代码以获得一些调试文本:

    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 添加一个动作监听器。问题是您永远不会在任何地方使用该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);
            }
        }
    }
    

    现在它应该可以正常工作并返回主屏幕了。

    编辑:您需要将 MAIN_STRING 设为 ElephantCare 类中的公共变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      相关资源
      最近更新 更多