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

时间:2011-02-25 17:11:28

标签: java swing validation

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

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

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

enter image description here enter image description here

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

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

public BaseWindow setContent(JComponent comp){
    contentPane.add(comp);
    contentPane.revalidate();
    contentPane.repaint();
    return this;
}

6 个答案:

答案 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();