Java 向JPanel动态添加组件
我试图动态地向JPanel添加一些组件,但不幸的是它们没有出现。我只看到在构造函数中添加的那些 更新版本(添加一个新的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();
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放在第一个(父)JPanelView
上,然后重新验证并重新绘制两者,也不会改变“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
}
}