java - 使用 CardLayout 切换面板

标签 java swing

谁能告诉我为什么当我单击 StartScreen 面板中的创建按钮时没有任何反应?基本上,我有一个 JFrame,在该 JFrame 中,我有一个使用 CardLayoutJPanel。我还有另外两个 JPanel,称为 StartScreenCreatePanel。在 StartScreen 面板中,我有两个 JButton,其中一个称为 _createBtn,当我单击该按钮时,我想要 CreatePanel 显示在我的 MainFrame 类中使用 CardLayout_panelContainer 上。我只是不明白为什么它不起作用,有人可以告诉我我的代码中做错了什么吗?谢谢。

这是我的 MainFrame 类:

package View;

import java.awt.CardLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainFrame extends JFrame{

/**
 * generated serial
 */
private static final long serialVersionUID = 1L;

/**
 * window's width
 */
protected static final int WIDTH = 1200;

/**
 * window's height
 */
protected static final int HEIGHT = 800;

/**
 * panel container
 */
private JPanel _panelContainer = new JPanel();

/**
 * card layout
 */
private CardLayout _cardLayout = new CardLayout();

public MainFrame() {
    setTitle("HighBid");
    setSize(WIDTH,HEIGHT);
    setResizable(false);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    addComponents();
}

/**
 * Adding components like JPanel here.
 */
private void addComponents() {
    StartScreen start = new StartScreen();
    CreatePanel create = new CreatePanel();
    _panelContainer.setLayout(_cardLayout);
    _panelContainer.add(start, "StartScreen");
    _panelContainer.add(create, "CreatePanel");
    _cardLayout.show(_panelContainer, "StartScreen");
    this.setContentPane(_panelContainer);

}

/**
 * Switching between panels.
 */
public void swapPanel(String next) {
    if("StartScreen".equals(next)) {
        _cardLayout.show(_panelContainer, "StartScreen");
    } else if ("CreatePanel".equals(next)) {
        _cardLayout.show(_panelContainer, "CreatePanel");
    }
}

}

这是我的 StartScreen 面板:

package View;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
* Start screen JPanel
* 
* @author 
* @version 5/19/2015
*/
public class StartScreen extends JPanel {

/**
 * default serial
 */
private static final long serialVersionUID = 1L;

/**
 * Start screen's label
 */
private JLabel _label;

/**
 * create button
 */
private JButton _createBtn;

/**
 * open button
 */
private JButton _openBtn;


public StartScreen() {
    setSize(MainFrame.WIDTH, MainFrame.HEIGHT);
    setLayout(null);
    setComponents();
    addComponents();
    setListeners();
}

private void setListeners() {

    _createBtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            MainFrame mf = new MainFrame();
            JButton src = (JButton) e.getSource();

            if(src.equals(_createBtn)) {
                mf.swapPanel("CreatePanel");
            } else {
                mf.swapPanel("StartScreen");
            }

        }

    });
}

/**
 * Setting for each component in this panel.
 */
private void setComponents() {
    // Set HighBid Label
    _label = new JLabel("Welcome to HighBid");
    _label.setFont(new Font("Tahoma", 0, 70));
    _label.setBounds((int)(MainFrame.WIDTH / 4.5), 100,700,100);
    _label.setForeground(Color.BLUE);

    // Set create button
    _createBtn = new JButton("Create Auction");
    _createBtn.setBounds((int)(MainFrame.WIDTH / 4.5), 350, 270, 100);
    _createBtn.setFont(new Font("Tahoma", 0, 36));

    // Set open button
    _openBtn = new JButton("Open Auction");
    _openBtn.setBounds((int)(MainFrame.WIDTH / 1.9), 350, 270, 100);
    _openBtn.setFont(new Font("Tahoma", 0, 36));

}

/**
 * Add the component to the panel.
 */
private void addComponents() {
    this.add(_label);
    this.add(_createBtn);
    this.add(_openBtn);
}
}

这是我的 CreatePanel 面板:

package View;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class CreatePanel extends JPanel {

/**
 * Default serial.
 */
private static final long serialVersionUID = 1L;

/**
 * label for create panel's form
 */
private JLabel _createLabel;

/**
 * back button
 */
private JLabel _backBtn;

public CreatePanel() {
    setSize(MainFrame.WIDTH, MainFrame.HEIGHT);
    setLayout(null);
    setListeners();
}

private void setListeners() {

}

}

这是我的主要类(class):

package View;

import java.awt.EventQueue;

public class HighBidMain {

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new MainFrame().setVisible(true);  
        }
    });
}

}

最佳答案

您正在 StartScreenActionListener 中创建 MainFrame 的新实例,此 MainFrame 实例> 与用户可见的窗口没有关系。

您应该有某种 Controller ,负责根据当前 View 和用户输入确定应采取的操作过程。然后它将负责更新主视图。

每个 subview 都将获得该 Controller 的相同实例,并且需要与其通信以了解其想要执行的操作。

例如:

关于java - 使用 CardLayout 切换面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30341117/

相关文章:

java - 当任务出现错误时,不要开始下一个任务并停止流程

java - 如何将数据传递给作为 MethodInvokingJobDetailFactoryBean 运行的方法?

java - 在 ButtonGroup 上监听 "child"更改,并打印选定的 JRadioButton 的文本

java - 我如何实际使用分隔符?

java - 如何设置JFrame图标图像?

java - java 的curl 的跟随

java - 检查 Playstore 是否安装了 Android 应用

java - 避免对 bean 属性进行大量 != null 检查

java - 如何在第二个窗口中更新 jFrame?

java - 工具提示消失后如何重新绘制?