java在JPanel中动态添加JLabel(重新验证无效)
我有一个方法尝试在PackingByVolDialog类的JPanel中动态添加标签:
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
这是MCVE(?)我被要求做出(我希望它是正确的和有帮助的)
public class VolDialog extends JDialog {
private static JLabel label = new JLabel() ;
private static JPanel contentPanel = new JPanel();
private static VolDialog dialog = new VolDialog();
public static void main(String[] args) {
try {
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.add(contentPanel);
dialog.revalidate();
dialog.repaint();
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void addContent( String text) {
contentPanel = new JPanel();
changingLabel = new JLabel();
changingLabel.setText(text);
contentPanel.add(changingLabel);
}
public class content {
for (int u=0; u<N; u++) {
VolDialog.addContent("text");
} //end for
}
即使在使用JPanel的repaint
和revalidate
时,窗口中也只显示最后的输出
有人知道问题出在哪里吗
# 1 楼答案
这就是为什么你在提问时总是需要创建并发布MCVE。我们没有时间查看和了解您的整个项目。这取决于你理解你所问的问题,然后简化代码来复制问题。很多时候,当你这样做的时候,你会发现你的问题。如果没有,那么你可以发布一段简单的代码
一旦你做了几次,就像生活中的任何事情一样,它就会变得越来越容易
您仍然应该生成结构良好、设计良好的代码。使用正常的Swing编码约定来正确创建MVCE不需要更多时间
例如:
您不应该扩展JDialog。您所做的只是将组件添加到对话框中,这样在main()方法中就可以创建对话框
您不应该使用静态变量和方法。这表明代码设计不当
类名应以大写字符开头
你的代码无法编译
您永远不会创建“content”类的新实例,因此addContent(…)方法永远不会被调用。这意味着你甚至从未测试过你发布的代码
当你问这个问题时,你需要花时间把事情做好,并向我们提供解决问题所需的信息
Swing框架和对话框的默认布局管理器是
BorderLayout
。只能将单个组件添加到BorderLayout的“中心”(不指定约束时为默认设置)所以基本上你需要改变对话框的布局管理器。尝试改变:
看看有什么不同
如果你需要更多的帮助,那么发布一个合适的MCVE。一个能够真正编译并且设计良好的程序