2017-03-07 96 views
0

我想用CardLayout创建一个带参数的JPanel。我有以下代码:Java在JFrame中创建cardLayout,构造函数参数为

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 

我有什么做的,解决这个问题?

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

回答

4

你的问题是你正在使用的CardLayout对象。这CardLayout对象,您使用的是show的组件:

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

是不一样的一个是目前的contentPane而这里的布局:

this.contentPane.setLayout(cardLayout); 

事实上,它似乎这个后面的cardLayout变量在使用时实际上是空的。

解决办法,改成这样:

公共级的大型机扩展的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)); 
    } 

} 
+0

谢谢你,你救了我的一天 – leonkuehn