swing java validate()方法无法正常工作
我有一个JFrame,里面是一个jpanel,我用它作为内容窗格
因此,基本上我使用jpanel在单击时将内容加载到中。新内容以Jpanel的形式返回,因此其最终为Jpanel->;内部jpanel->;在Jframe内部。当我需要加载新内容时,我会清除面板,加载新内容并验证()jframe&;jpanel和新内容显示
我的问题是,当新内容清楚地显示时,验证方法正在工作,因为我可以看到新的界面,但我也可以看到旧的界面,就好像它成为背景一样;我可以调整窗口的大小,它只是消失了,看起来就像它应该的那样
这只是验证工作的方式还是我可以修复它
编辑:这起作用了。问题是我没有手动调用重新绘制
public BaseWindow setContent(JComponent comp){
contentPane.add(comp);
contentPane.revalidate();
contentPane.repaint();
return this;
}
# 1 楼答案
我最终通过更改添加/删除的面板解决了我的问题(显示未显示,按钮将保持单击/未松开)
问题:
解决方案:
# 2 楼答案
下面是另一个可能的解决方案:
将两个JPanel同时并排放入,然后确保在任何时候都只能看到其中一个:
然后,当用户单击按钮切换面板时:
setVisible()方法和BorderLayout应该负责为您验证、布局和调用repaint()
# 3 楼答案
通常,从面板中添加/删除一个或两个组件的代码为:
但是,如果要替换面板上的所有组件,则更好的方法是使用Card Layout
您已经声明了revaliate()后跟repaint()不起作用,因此我唯一的建议是发布演示问题的SSCCE
# 4 楼答案
Validate()用于使组件根据已安装的layoutmanager重新排列。这并不是你应该使用的
我看不到你的代码,所以我不确定你到底在做什么。我可以推测,在“内部面板”上调用repaint()将解决您遇到的问题。。。但实际上,如果您做得很好,就不需要调用repaint()或validate()
制作两个JPanel,一个包含内容A(例如按钮),另一个包含内容B(例如“静态”字段)。在父容器(JFrame的内容窗格?)上使用“add()”和“remove()”方法每当您想要切换JFrame的该部分中显示的内容时,就可以互相交换这两个JPanel
那么你就不需要做任何其他事情了;它应该会起作用
# 5 楼答案
不要使用验证。改用revalidate()
Revalidate首先调用invalidate(),然后调用validate()。 在Swing中,很少使用validate()
注意:我还觉得可能旧面板未清除/移除。再检查一遍
# 6 楼答案
我不知道validate()是否承诺完全重新绘制容器。您可能需要自己调用repaint()以使其按您所希望的方式运行