【问题标题】:Switching panels using CardLayout使用 CardLayout 切换面板
【发布时间】:2015-05-20 05:39:11
【问题描述】:

谁能告诉我为什么当我单击StartScreen 面板中的创建按钮时没有任何反应?基本上,我有一个JFrame,在那个JFrame 中,我有一个使用CardLayoutJPanel。我还有另外两个JPanel,分别称为StartScreenCreatePanel。在StartScreen 面板中,我有两个JButton,其中一个称为_createBtn,当我单击该按钮时,我希望CreatePanel 出现在我的_panelContainer 上,即在我的CardLayout MainFrame 班级。我只是不明白为什么它不起作用,谁能告诉我我在代码中做错了什么?谢谢。

这是我的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() {

}

}

这是我的主要课程:

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);  
        }
    });
}

}

【问题讨论】:

    标签: java swing


    【解决方案1】:

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

    您应该有某种控制器,负责根据当前视图和用户输入确定应采取的行动过程。然后它将负责更新主视图。

    每个子视图都将被赋予该控制器的相同实例,并且需要与它就它想要做什么进行通信。

    例如:

    【讨论】:

    • 谢谢.. 这就是问题所在,我会看看这些链接并修复我的代码。
    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多