Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向JPanel动态添加组件_Java_Swing_Jpanel - Fatal编程技术网

Java 向JPanel动态添加组件

Java 向JPanel动态添加组件,java,swing,jpanel,Java,Swing,Jpanel,我试图动态地向JPanel添加一些组件,但不幸的是它们没有出现。我只看到在构造函数中添加的那些 更新版本(添加一个新的JPanel,其中所有组件都将: 公共类视图扩展了JPanel{ JPanel面板=新的JPanel(); JLabel标签; JLabel标签[]; JButton b1=新JButton(“正常”); 公众观点(){ this.setLayout(新的FlowLayout()); this.add(panel);//添加新的JPanel 标签=新的JLabel(“我的标签”)

我试图动态地向JPanel添加一些组件,但不幸的是它们没有出现。我只看到在构造函数中添加的那些

更新版本(添加一个新的JPanel,其中所有组件都将:

公共类视图扩展了JPanel{
JPanel面板=新的JPanel();
JLabel标签;
JLabel标签[];
JButton b1=新JButton(“正常”);
公众观点(){
this.setLayout(新的FlowLayout());
this.add(panel);//添加新的JPanel
标签=新的JLabel(“我的标签”);
panel.add(label);//将标签添加到新面板(此面板有效)
}
公共空间显示标签(){
System.out.println(“调用函数showLabels”);
标签=新的JLabel[5];
对于(int i=0;i<5;i++){
标签[i]=新的JLabel(“标签:+i”);
panel.add(labels[i]);//这个不起作用
}
panel.add(b1);//这个也不起作用
this.validate();//验证此类(父容器)
panel.validate();//验证所有组件所在的面板
}
}
不幸的是,没有任何更改。

调用父容器,如中所示。左下角的标签是动态添加的。请注意,调用
pack()
可能会导致GUI的大小发生更改,而调用
validate()
则不会。如果需要调整GUI的大小,请调用
pack()
,否则请调用
validate()

调用父容器,如中所示。左下角的标签是动态添加的。请注意,调用
pack()
可能会导致GUI的大小发生更改,而调用
validate()
则不会。如果需要调整GUI的大小,请调用
pack()
,否则请调用
validate()


您是否尝试在父
JFrame
上调用
pack()
?还没有。仅仅调用revalidate()或其他东西还不够吗?JPanel的布局是什么?某些组件可以在某些布局(如BorderLayou)中重叠。尝试BoxLayout或FlowLayout。我默认使用FlowLayout。您是否尝试在父级
JFrame
上调用
pack()
?尚未。仅仅调用revalidate()或其他东西还不够吗?JPanel的布局是什么?某些组件可以在某些布局(如BorderLayou)中重叠。请尝试BoxLayout或FlowLayout。默认情况下,我使用FlowLayout。即使我先将所有组件放在单独的JPanel上,然后将新的JPanel放在第一个(父)JPanel
视图上,然后重新验证并重新绘制这两种方法,也不会改变…“重新验证并重新绘制”。。请注意,我没有提到这两种方法(理由充分)。也许你正在考虑mre的答案(现在已经被删除了)。好的,到目前为止我已经更新了我的代码。现在我只使用了
validate()
,但没有任何变化。“到目前为止我的代码”(叹气)请理解几点。1) 上述术语“SSCCE”是一个链接。2) 当我发布一个链接时,我希望你关注它,阅读它,并询问你是否有任何问题。3) 发布该链接(除其他外)是一个暗示,表明我不会费心去看模糊的代码描述或代码片段。4) 更新不包含SSCCE。-我的密码很短,是的。到目前为止还不错。“.self-contained,”*直接引用代码。。可以“复制、粘贴、编译、运行”前两个都可以。在添加导入之前,代码不会编译(为了使代码更短,我经常妥协并进行“包”导入,而不是单独的类导入)。代码不会运行,因为它没有创建GUI、将其添加到顶级容器并将容器设置为可见的
main()
。“但我认为,我在遵守规则”SSCCE是一项建议,而不是规则。此后,即使我首先将所有组件放在一个单独的JPanel上,然后将新的JPanel放在第一个(父)JPanel
View
上,然后重新验证并重新绘制两者,也不会改变“SSCCE”或“非SSCCE”。请注意,我没有提到这两种方法(理由充分)。也许你正在考虑mre的答案(现在已经被删除了)。好的,到目前为止我已经更新了我的代码。现在我只使用了
validate()
,但没有任何变化。“到目前为止我的代码”(叹气)请理解几点。1) 上述术语“SSCCE”是一个链接。2) 当我发布一个链接时,我希望你关注它,阅读它,并询问你是否有任何问题。3) 发布该链接(除其他外)是一个暗示,表明我不会费心去看模糊的代码描述或代码片段。4) 更新不包含SSCCE。-我的密码很短,是的。到目前为止还不错。“.self-contained,”*直接引用代码。。可以“复制、粘贴、编译、运行”前两个都可以。在添加导入之前,代码不会编译(为了使代码更短,我经常妥协并进行“包”导入,而不是单独的类导入)。代码不会运行,因为它没有创建GUI、将其添加到顶级容器并将容器设置为可见的
main()
。“但我认为,我在遵守规则”SSCCE是一项建议,而不是规则。此后,某事物要么是“SSCCE”,要么是“非SSCCE”
public class View extends JPanel {

JPanel panel = new JPanel();
JLabel label;
JLabel labels[];
JButton b1 = new JButton("OK");

public View() {
   this.setLayout(new FlowLayout());
   this.add(panel); // adding a new JPanel
   label = new JLabel("My label");
   panel.add(label);  // adding label to the new panel (this one works)
}


public void showLabels() {
  System.out.println("function showLabels called");

  labels = new JLabel[5];

  for (int i = 0; i < 5; i++) {
      labels[i] = new JLabel("Label: " + i);
      panel.add(labels[i]); // this one doesn't work
  }
  panel.add(b1); // this one doesn't work, too
    this.validate(); // validating this class (parent container)
    panel.validate(); // validating the panel, where all the components are
  }
}