我有一个方法试图在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
,也只会在窗口中显示最后一个输出。
有谁知道问题出在哪里?
答案 0 :(得分:0)
我正在做的项目太大而复杂
这就是为什么你总是需要在提问时创建和发布MCVE。我们没有时间查看和了解您的整个项目。您可以自行了解所询问的问题,然后简化代码以复制问题。很多时候,当你这样做时,你会发现你的问题。如果没有,那么你可以发布一段简单的代码。
这不是一件容易的事。
一旦你做了几次,就像生活中的任何事情一样,它变得更容易,更容易。
我很急,因为我没有时间编写新代码
那么你仍然应该生成结构良好且设计良好的代码。使用正常的Swing编码约定不再需要时间来创建MVCE。
例如:
您不应该扩展JDialog。您所做的只是向对话框添加组件,因此在main()方法中您只需创建对话框。
您不应该使用静态变量和方法。这表明代码设计不佳。
班级名称应以大写字母
您的代码无法编译。
您永远不会创建“content”类的新实例,因此永远不会调用addContent(...)方法。所以这意味着你甚至都没有测试过你发布的代码。
当您提出问题时,您需要花时间正确地做事并向我们提供解决问题所需的信息。
只有最后一个输出显示在窗口中。
Swing框架和对话框的默认布局管理器是BorderLayout
。您只能将单个组件添加到BorderLayout的“CENTER”(当您未指定约束时,这是默认设置)。
所以基本上你需要更改对话框的布局管理器。尝试更改:
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setLayout( new FlowLayout() );
看到差异。
如果您需要更多帮助,请发布适当的MCVE。一个实际编译并且设计得很好的。