java validate()方法无法正常工作

问题描述 投票:3回答:6

我有一个JFrame,里面是一个jpanel,我用作内容窗格。

所以基本上我使用jpanel将内容加载到点击。新内容作为Jpanel返回,因此它最终成为jpanel - > jpanel内部 - > Jframe内部。当我需要加载新内容时,我清除面板,加载新内​​容并验证()jframe&jpanel和新内容显示。

我的问题是,当新内容清楚显示验证方法正在工作,因为我可以看到新界面,但我也可以看到旧界面好像它成为背景;我可以调整窗口大小,它只是消失,看起来应该是这样。

这只是验证的工作方式还是可以修复它?

编辑:这个工作。问题是我没有手动调用重绘。

public BaseWindow setContent(JComponent comp){
    contentPane.add(comp);
    contentPane.revalidate();
    contentPane.repaint();
    return this;
}
java swing validation
6个回答
3
投票

通常,从面板添加/删除一个或两个组件的代码是:

panel.remove(..);
panel.add(...);
panel.revalidate();
panel.repaint(); // sometimes needed

但是,如果要更换面板上的所有组件,那么更好的方法是使用Card Layout

你已经声明revaliate()后面的repaint()不起作用所以我唯一的建议是发布你的SSCCE来证明这个问题。


2
投票

不要使用验证。请改用revalidate()

重新验证第一次调用invalidate()后跟一个validate()。在Swing中,您很少使用validate()。

注意:我也觉得可能旧的面板没有清除/删除。再次检查!


1
投票

Validate()用于使组件根据您安装的布局管理器重新排列。这不是你应该使用的。

我看不到你的代码,所以我不确定你到底在做什么。我可以推测在你的“内部面板”上调用repaint()将解决你遇到的问题......但实际上,如果你正确地做事,你不应该调用repaint()或validate()。

制作两个JPanel,一个包含内容A(例如您的按钮),另一个包含内容B(例如您的“静态”字段)。在您希望切换JFrame的该部分中显示的内容时,使用父容器(JFrame的内容窗格?)上的“add()”和“remove()”方法将这两个JPanel彼此交换。

那你就不需要做任何事了;它应该工作。


0
投票

我不知道validate()是否对完全重新绘制容器做出了任何承诺。您可能必须自己调用repaint()以使其按照您的意愿运行。


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()的验证,布局和调用。


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();
© www.soinside.com 2019 - 2024. All rights reserved.