繁体   English   中英

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

[英]java validate() method doesnt work properly

我有一个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

但是,如果要更换面板上的所有组件,则更好的方法是使用卡布局

你已经说过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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM