Java 在JPanel中动态添加JLabel(重新验证无效)
我有一个方法尝试在PackingByVolDialog类的JPanel中动态添加标签:Java 在JPanel中动态添加JLabel(重新验证无效),java,swing,jpanel,jlabel,Java,Swing,Jpanel,Jlabel,我有一个方法尝试在PackingByVolDialog类的JPanel中动态添加标签: public static void addContent( String content, String container) { contentPanel = new JPanel(); changingLabel = new JLabel(); changingLabel.setText(container+"\n"+content);
public static void addContent( String content, String container) {
contentPanel = new JPanel();
changingLabel = new JLabel();
changingLabel.setText(container+"\n"+content);
contentPanel.add(changingLabel);
contentPanel.revalidate();
contentPanel.repaint();
dialog.add(contentPanel);
}
在另一个类中,我调用addContent
方法,如下所示:
for (int u=0; u<containers.size()-1; u++) {
PackingByVolDialog.addContent(content, container);
} //end for
for(int u=0;u
我正在做的项目太大太复杂了
这就是为什么你在提问时总是需要创建和发布MCVE。我们没有时间查看和理解你的整个项目。这取决于你理解你所问的问题,然后简化代码以复制问题。很多时候,当你这样做时,你会发现你的问题。如果没有,那么你就有一个simp一段要发布的代码
这不是一项容易的任务
一旦你做了几次,就像生活中的任何事情一样,它就会变得越来越容易
我很忙,因为我根本没有时间写新代码
您仍然应该生成结构良好、设计良好的代码。使用正常的Swing编码约定正确地创建MVCE不需要更多的时间
例如:
您不应该扩展JDialog。您所做的只是向对话框中添加组件,以便在main()方法中创建对话框
您不应该使用静态变量和方法。这表明代码的设计很差
类名应以大写字符开头
您的代码无法编译
您从未创建“content”类的新实例,因此从未调用addContent(…)方法。这意味着您甚至从未测试过发布的代码
当你问问题时,你需要花时间把事情做好,并给我们解决问题所需的信息
窗口中仅显示最后一次输出
Swing框架和对话框的默认布局管理器是BorderLayout
。您只能将单个组件添加到BorderLayout的“中心”(未指定约束时为默认组件)
因此,基本上您需要更改对话框的布局管理器。请尝试更改:
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setLayout( new FlowLayout() );
看看有什么不同
如果您需要更多帮助,请发布一个正确的MCVE。一个实际编译且设计良好的MCVE。为什么在将面板添加到对话框之前调用重新验证和重新绘制(由于contentPanel尚不可见,因此没有效果)?您需要重新验证对话框,而不是contentPanel。此代码看起来不正确,包括使用静态交换JPanel和JLabel,避免CardLayout--要获得最佳帮助,请创建并发布有效的,以便我们能够真正了解情况。发布前请阅读链接。“我有一个尝试动态添加标签的方法。。"这里有一个想法。保持面板不变,不要每次都刷新它。保持相同的标签a好吧,只要更改标签文本!@FredK:我更改了代码,对对话框进行了重新验证,然后在将面板添加到对话框后调用它,就像你说的那样!但是没有任何更改,显示相同。这怎么可能是运行时问题的一个示例lem当它甚至不编译时?MCVE需要一个类定义、导入和一个main
方法来将它放在屏幕上。当你认为你有一个时,将它粘贴到IDE中的一个新项目中,编译它,运行它,并检查是否显示了问题。然后确保在编辑问题之前使用IDE为“格式化代码”定义的快捷方式我想添加它。或者像我通常在复制/粘贴注释中所说的那样:使用逻辑和一致的缩进形式来缩进代码行和代码块。缩进的目的是使代码流更易于遵循!谢谢你的回复和建议!我已经解决了这个问题,现在它工作得非常好。好吧,你应该告诉我在我们花时间回答问题之前告诉我们这些。一旦你找到答案,你就应该回答,这样我们就不会花时间回答已经回答过的问题。我本打算稍后发布答案,但你是对的。对此表示抱歉。
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setLayout( new FlowLayout() );