Tra*_*hel 4 java swing add jframe removeall
我有一个名为"LoadingWindow"的相对较小的类,这个类有一个构造函数,它调用Initialize函数来设置框架.不是我测试了一些东西试图解决为什么它不会更新.在测试时我添加了"this.removeAll();" 到初始化方法的头部.事实证明,之后我无法添加任何内容.我添加的任何内容都不会显示.
这是一个略微修剪过的版本:
public class LoadingWindow extends JFrame{
public JPanel panel;
public JProgressBar bar;
private JLabel label;
public LoadingWindow()
{
this.Initialize();
}
public void Initialize()
{
this.removeAll();
this.setSize(300, 150);
panel = new JPanel(new BorderLayout());
bar = new JProgressBar(0,100);
label = new JLabel("Please remain calm, we're just loading...");
panel.add(bar,BorderLayout.CENTER);
panel.add(label,BorderLayout.SOUTH);
this.add(panel);
this.validate();
this.repaint();
this.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
窗口本身确实弹出正确,带有标题.然而,窗口本身是完全空白的.
我静态地实现这个类,以便其他四个对象可以在EditorPanel类中访问它.其定义为:
public static LoadingWindow loadingWindow;
Run Code Online (Sandbox Code Playgroud)
并在构造函数中初始化:
loadingWindow = new LoadingWindow();
Run Code Online (Sandbox Code Playgroud)
然后在函数中进行双重检查,如果它被隐藏,则使用它来显示它.
if(!EditorPanel.loadingWindow.isVisible()){EditorPanel.loadingWindow.Initialize();}
Run Code Online (Sandbox Code Playgroud)
总的来说,我对于为什么没有内容显示有点困惑,我对任何问题都很感兴趣,并愿意提供任何必要的信息.谷歌并没有提供很多,而且我发现我已经实施了"重绘和验证"的每个答案.
我期待着您的回音!
〜特拉维斯
Dav*_*amp 13
removeAll()正如@TomHawtintackline所述(给他+1),不会转发给JFrames contentPane ; 喜欢add(),remove()或者setLayout()是.
因此,当你做JFrame#removeAll()它消除了根窗格的JFrame.请参阅如何使用根窗格进行有趣的阅读,并可能证明未来的努力取得丰硕成果.
你应该做:
getContentPane().removeAll(); //将确保我们从contentPane中删除所有组件
也不要JFrame不必要地扩展(除非添加超出其当前能力的功能)而只是创建一个实例JFrame并使用它
不要打电话setSize,而使用适当的LayoutManager和/或覆盖getPreferredSize()的JPanel,并返回其符合图纸尺寸,从而可以调用pack()上JFrame设置它可见之前.
我认为没有必要validate()和repaint()当组件被添加到一个可见的容器,这些只应调用.甚至revalidate()可以用于添加和删除组件(它会调用它validate())
| 归档时间: |
|
| 查看次数: |
3407 次 |
| 最近记录: |