gpt4 book ai didi

java - 使用 CardLayout 切换面板

转载 作者:行者123 更新时间:2023-12-01 11:31:36 25 4
gpt4 key购买 nike

谁能告诉我为什么当我单击 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com