谁能告诉我为什么当我单击 StartScreen
面板中的创建按钮时没有任何反应?基本上,我有一个 JFrame
,在该 JFrame
中,我有一个使用 CardLayout
的 JPanel
。我还有另外两个 JPanel
,称为 StartScreen
和 CreatePanel
。在 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);
}
});
}
}
最佳答案
您正在 StartScreen
的 ActionListener
中创建 MainFrame
的新实例,此 MainFrame
实例> 与用户可见的窗口没有关系。
您应该有某种 Controller ,负责根据当前 View 和用户输入确定应采取的操作过程。然后它将负责更新主视图。
每个 subview 都将获得该 Controller 的相同实例,并且需要与其通信以了解其想要执行的操作。
例如:
关于java - 使用 CardLayout 切换面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30341117/