2017-03-07 15 views
0

JPanelをパラメータ付きCardLayoutで作成します。私は、次のコードを持っている: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オブジェクトにあります。あなたがコンポーネントshowに使用しているこのCardLayoutオブジェクト:

this.contentPane.setLayout(cardLayout); 

実際には、それが表示されます。

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

は現在、ここにあなたのcontentPaneのレイアウトである1と同じではありませんこの後者のcardLayout変数は実際には使用時にはnullであることを示します。

ソリューションは、これまでの変更:

パブリッククラスのメインフレームは、JFrameの{

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

を拡張し、他の場所でnew CardLayout();を呼び出すことはありません。


もう1つの問題は、コンストラクタを呼び出すときに空のStringを渡すことです。

例えば、

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

関連する問題