【发布时间】:2016-05-02 16:47:24
【问题描述】:
我有一个方法尝试在 JPanel 中的 PackingByVolDialog 类中动态添加标签:
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,窗口中也只会显示最后的输出。
有谁知道问题出在哪里?
【问题讨论】:
-
为什么在将面板添加到对话框之前调用revalidate和repaint(不会有效果,因为contentPanel还不可见)?而且您需要重新验证对话框,而不是 contentPanel。
-
这段代码看起来不正确,包括使用静态交换 JPanel 和 JLabel ,避免使用 CardLayout -- 为了获得最好的帮助,请创建并发布一个有效的minimal reproducible example 这样我们就可以真正看看发生了什么。发帖前请阅读链接。
-
“我有一个尝试动态添加标签的方法..” 这是一个想法。保持面板不变,不要每次都刷新。保持相同的标签a好,只需更改标签文字!
-
@FredK :我更改了代码并对对话框进行了重新验证,然后在将面板添加到对话框后调用它,就像你说的那样!但没有任何改变,同样的显示。
-
当它甚至没有编译时,它怎么会成为一个运行时问题的例子呢? MCVE 需要类定义、导入和
main方法才能将其显示在屏幕上。当你认为你有一个时,将它粘贴到你的 IDE 中的一个新项目中,编译它,运行它,然后检查问题是否显示。然后确保在编辑问题以添加之前使用 IDE 为“格式化代码”定义的快捷方式。或者就像我通常在复制/粘贴注释中所说的那样:使用合乎逻辑且一致的缩进代码行和块的形式。缩进是为了让代码的流程更容易理解!