有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

  1. # 1 楼答案

    我最终通过更改添加/删除的面板解决了我的问题(显示未显示,按钮将保持单击/未松开)

    问题:

    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();
    
  2. # 2 楼答案

    下面是另一个可能的解决方案:

    将两个JPanel同时并排放入,然后确保在任何时候都只能看到其中一个:

    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()

  3. # 3 楼答案

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

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

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

    您已经声明了revaliate()后跟repaint()不起作用,因此我唯一的建议是发布演示问题的SSCCE

  4. # 4 楼答案

    Validate()用于使组件根据已安装的layoutmanager重新排列。这并不是你应该使用的

    我看不到你的代码,所以我不确定你到底在做什么。我可以推测,在“内部面板”上调用repaint()将解决您遇到的问题。。。但实际上,如果您做得很好,就不需要调用repaint()或validate()

    制作两个JPanel,一个包含内容A(例如按钮),另一个包含内容B(例如“静态”字段)。在父容器(JFrame的内容窗格?)上使用“add()”和“remove()”方法每当您想要切换JFrame的该部分中显示的内容时,就可以互相交换这两个JPanel

    那么你就不需要做任何其他事情了;它应该会起作用

  5. # 5 楼答案

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

    Revalidate首先调用invalidate(),然后调用validate()。 在Swing中,很少使用validate()

    注意:我还觉得可能旧面板未清除/移除。再检查一遍

  6. # 6 楼答案

    我不知道validate()是否承诺完全重新绘制容器。您可能需要自己调用repaint()以使其按您所希望的方式运行