我有一个JFrame,里面是一个jpanel,我用作内容窗格。
所以基本上我使用jpanel将内容加载到点击。新内容作为Jpanel返回,因此它最终成为jpanel - > jpanel内部 - > Jframe内部。当我需要加载新内容时,我清除面板,加载新内容并验证()jframe&jpanel和新内容显示。
我的问题是,当新内容清楚显示验证方法正在工作,因为我可以看到新界面,但我也可以看到旧界面好像它成为背景;我可以调整窗口大小,它只是消失,看起来应该是这样。
这只是验证的工作方式还是可以修复它?
编辑:这个工作。问题是我没有手动调用重绘。
public BaseWindow setContent(JComponent comp){
contentPane.add(comp);
contentPane.revalidate();
contentPane.repaint();
return this;
}
通常,从面板添加/删除一个或两个组件的代码是:
panel.remove(..);
panel.add(...);
panel.revalidate();
panel.repaint(); // sometimes needed
但是,如果要更换面板上的所有组件,那么更好的方法是使用Card Layout。
你已经声明revaliate()后面的repaint()不起作用所以我唯一的建议是发布你的SSCCE来证明这个问题。
不要使用验证。请改用revalidate()。
重新验证第一次调用invalidate()后跟一个validate()。在Swing中,您很少使用validate()。
注意:我也觉得可能旧的面板没有清除/删除。再次检查!
Validate()用于使组件根据您安装的布局管理器重新排列。这不是你应该使用的。
我看不到你的代码,所以我不确定你到底在做什么。我可以推测在你的“内部面板”上调用repaint()将解决你遇到的问题......但实际上,如果你正确地做事,你不应该调用repaint()或validate()。
制作两个JPanel,一个包含内容A(例如您的按钮),另一个包含内容B(例如您的“静态”字段)。在您希望切换JFrame的该部分中显示的内容时,使用父容器(JFrame的内容窗格?)上的“add()”和“remove()”方法将这两个JPanel彼此交换。
那你就不需要做任何事了;它应该工作。
我不知道validate()是否对完全重新绘制容器做出了任何承诺。您可能必须自己调用repaint()以使其按照您的意愿运行。
这是另一种可能的解决方案:
将两个JPanels同时并排放入,然后确保在任何时候只能看到其中一个:
JPanel p = new JPanel(new BorderLayout());
p.add( panelA, BorderLayout.EAST );
p.add( panelB, BroderLayout.WEST );
panelA.setVisible(true);
panelB.setVisible(false);
然后当用户单击按钮切换面板时:
panelA.setVisible(false);
panelB.setVisible(true);
setVisible()方法和BorderLayout应该为您处理repaint()的验证,布局和调用。
我最后通过更改添加/删除了哪些面板来修复我的问题(显示屏未显示,按钮会保持点击状态/未点亮)。
问题:
frame.removeAll();
frame.add(getNewPanelDisplay());
frame.revalidate();
frame.repaint();
解:
//initializer()
mainPanel = new JPanel();
frame.add(mainPanel());
// ...
//update()
mainPanel.remove(0);
mainPanel.add(getTablePanel(), 0);
frame.revalidate();
frame.repaint();