【问题标题】:Java create cardLayout in JFrame with constructor parameterJava使用构造函数参数在JFrame中创建cardLayout
【发布时间】:2017-03-07 20:07:08
【问题描述】:

我想用CardLayout 和一个参数创建一个JPanel。我有以下代码:

public class MainFrame extends JFrame{

private JPanel contentPane;
private CardLayout cardLayout;
private String card;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                MainFrame frame = new MainFrame("");
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public MainFrame(String card) {
    initComponents();
    cardLayout = new CardLayout();

    if(card.equals("ADMIN")){
        contentPane.revalidate();
        cardLayout.show(this.contentPane, "ADMIN");
    }else if(card.equals("USER")){
        contentPane.revalidate();
        cardLayout.show(this.contentPane, "USER");
    }
}

private void initComponents() {
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(1280, 800);
    this.contentPane = new JPanel();
    this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    this.contentPane.setLayout(cardLayout);
    this.contentPane.add(new PanelOne(), "ADMIN");
    this.contentPane.add(new PanelTwo(), "USER");
    setContentPane(this.contentPane);
}

但是如果我运行这段代码,我会得到一个异常:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException:
    wrong parent for CardLayout

我该怎么做才能解决这个问题?

我已经尝试在main方法中更改参数,但没有任何解决方案。

【问题讨论】:

    标签: java swing exception layout-manager cardlayout


    【解决方案1】:

    您的问题出在您正在使用的 CardLayout 对象中。这个 CardLayout 对象,您用于show 组件:

    public MainFrame(String card) {
        initComponents();
        cardLayout = new CardLayout();
    

    和你这里的 contentPane 的布局不一样:

    this.contentPane.setLayout(cardLayout);
    

    事实上,后面这个cardLayout变量在使用的时候实际上是null。

    解决办法,改成这样:

    公共类 MainFrame 扩展 JFrame{

    private JPanel contentPane;
    private CardLayout cardLayout = new CardLayout();
    

    并且不要在其他地方打电话给new CardLayout();


    另一个问题是你在调用构造函数时传入了一个空字符串。

    例如,

    import java.awt.CardLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Toolkit;
    
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    
    public class MainFrame extends JFrame {
    
        private JPanel contentPane;
        private CardLayout cardLayout = new CardLayout();
        private String card;
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        MainFrame frame = new MainFrame(PanelOne.NAME);
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
        public MainFrame(String card) {
            initComponents();
            // cardLayout = new CardLayout();        
            cardLayout.show(getContentPane(), card);
        }
    
        private void initComponents() {
            Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
            this.setLocation(dim.width / 2 - this.getSize().width / 2,
                    dim.height / 2 - this.getSize().height / 2);
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(1280, 800);
            this.contentPane = new JPanel();
            this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            this.contentPane.setLayout(cardLayout);
            this.contentPane.add(new PanelOne(), PanelOne.NAME);
            this.contentPane.add(new PanelTwo(), PanelTwo.NAME);
            setContentPane(this.contentPane);
        }
    }
    

    public class PanelOne extends JPanel {
        public static final String NAME = "Administrator";
    
        public PanelOne() {
            setBorder(BorderFactory.createTitledBorder(NAME));
        }
    }
    

    public class PanelTwo extends JPanel {
        public static final String NAME = "User";
    
        public PanelTwo() {
            setBorder(BorderFactory.createTitledBorder(NAME));
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-22
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多