Java 在另一个类的JFrame中调用JPanel
我已经用一个JPanel创建了一个类,它将用于CardLayout,如果我删除注释//它的窗口大小位于代码的底部,这就可以了。它将以这种方式运行,所有功能都将完美运行。然而,当我试图从另一个类调用它时,它没有工作,这个类中有一个JFrame CardDemo.java:Java 在另一个类的JFrame中调用JPanel,java,swing,jframe,jpanel,cardlayout,Java,Swing,Jframe,Jpanel,Cardlayout,我已经用一个JPanel创建了一个类,它将用于CardLayout,如果我删除注释//它的窗口大小位于代码的底部,这就可以了。它将以这种方式运行,所有功能都将完美运行。然而,当我试图从另一个类调用它时,它没有工作,这个类中有一个JFrame CardDemo.java: import java.awt.CardLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent;
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
}
}
Test.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中)
我做错了什么,因为我似乎无法确定它。您正在将JFrame添加到您的JPanel中。应该是相反的。frame变量指的是JFrame,它是顶级窗口。这是所有组件的顶级容器,因此您需要向其中添加组件,而不是相反。您需要更改
b.add(frame);
到
关于
“请不要批准此内容,因为我不希望此内容保留在此处,我希望在之后删除此内容,因为我不希望我的工作留在网上,非常感谢。”
--您不能这样做。如果发布在这里,它应该留在这里,因为发布在这里的问题不仅仅是为了您的利益,而是为了所有未来有类似问题的访问者。我已经从你们的问题中删除了这个,所以毫无疑问。问题回到了以前的状态。请不要在没有解释的情况下修改你的代码。没有人会窃取你的代码。不管怎样,我坚持我之前的评论,这些问题不仅仅是为了提问者的利益,而是主要针对本网站的未来访问者。
frame.add(b);