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