-2

CardLayout に使用される 1 つの JPanel を持つクラスを作成しました。これは、コードの下部にあるウィンドウ サイズを持つコメント // を削除すると正常に機能します。そのように実行され、すべてが完全に機能します。ただし、JFrame を含む別のクラスから呼び出そうとすると、機能しません。

CardDemo.java:

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;

public class CardDemo extends JPanel implements ListSelectionListener {

CardLayout cl;
JPanel p1, p2, p3, p4, p5;
JList l1;


public CardDemo(){

    p1 = new JPanel();
    p1.setBackground(Color.red);   //the top panel

    String[] list1 = { "One", "Two", "Three"};
    l1 = new JList(list1);
    l1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    l1.addListSelectionListener(this);

    p1.add(l1);

    p2 = new JPanel();
    p2.setBackground(Color.blue);  //bottom panel - we never actually see this

    cl = new CardLayout();
    p2.setLayout(cl);


    p3 = new JPanel();
    p3.setBackground(Color.green);
    p4 = new JPanel();
    p4.setBackground(Color.yellow); 
    p5 = new JPanel();
    p5.setBackground(Color.cyan);


    p2.add(p3, "One");
    p2.add(p4, "Two");
    p2.add(p5, "Three");

    //this.setSize(500,400);
   //this.setVisible(true);
   this.setLayout(new GridLayout(2,2));
   this.add(p1);
   this.add(p2);

}

/** The actionPerformed method handles button clicks
 */
public void valueChanged(ListSelectionEvent e) {
    String listLabel = (String) ((JList)e.getSource()).getSelectedValue();    //get the label of the button that was clicked
    cl.show(p2, listLabel);             //use the label to display the relevant panel
}
}   

テスト.java

import javax.swing.*;
import java.awt.*;

public class Test extends JFrame
{

public Test()
{
  JFrame frame = new JFrame("CardLayoutDemo");
  frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

  CardDemo b = new CardDemo();
  b.add(frame);

  frame.pack();
  frame.setVisible(true);
}


}

すべて正常にコンパイルされますが、Test.java を実行すると、次のエラーが発生します。

java.lang.IllegalArgumentException: コンテナへのウィンドウの追加 (java.awt.Container 内)

それを特定できないように見えるので、私が間違っているのは何ですか。

4

2 に答える 2

1

変更する必要があります

b.add(frame);  

frame.add(b);
于 2013-11-03T13:38:45.890 に答える
0

JFrame を JPanel に追加しています。それは逆であるべきです。フレーム変数は、最上位ウィンドウである JFrame を参照します。これはすべてのコンポーネントの最上位のコンテナであるため、コンポーネントを追加する必要がありますが、その逆ではありません。

于 2013-11-03T13:37:51.230 に答える