代码之家  ›  专栏  ›  技术社区  ›  aditya rawat

是框架。revalidate()在事件后获取输出很重要吗?

  •  0
  • aditya rawat  · 技术社区  · 7 年前

    因此,我编写了一段代码,在单击框架南部区域的按钮后,可以得到一个矩形。

    但由于这个原因,在点击按钮后,代码似乎不起作用

    public void actionPerformed(ActionEvent ev){
        Drawing d = new Drawing();
        frame.add(d);
        frame.repaint();
       }
    

    以及我添加的 revalidate() 在街区内。

     public void actionPerformed(ActionEvent ev){
        Drawing d = new Drawing();
        frame.add(d);
        frame.revalidate();
        frame.repaint();
       }
    

    现在代码运行得很好,但在我研究的地方,他们没有使用 重新验证() 他们的代码起作用了。

    为什么会这样?

    1 回复  |  直到 7 年前
        1
  •  1
  •   MadProgrammer    7 年前

    因此,您引用的示例是使用自定义绘制方法绘制组件。这不会(直接)影响组件的大小或位置,因此不需要容器来执行新的布局传递。

    看见 Performing Custom Painting Painting in Swing 有关更多详细信息

    您的代码正在向容器中添加一个新组件,因此您需要告诉容器何时需要重新布置容器。

    所以,从 JavaDocs

    public void revalidate()
    支持延迟自动布局。电话 使无效,然后将此组件的validateRoot添加到 需要验证的组件。最终将进行验证 已调度当前挂起的事件。换句话说,在 调用此方法时,在 向上遍历此组件的包含层次结构将是 已验证。默认情况下,JRootPane、JScrollPane和JTextField返回 isValidateRoot中的true。

    当 属性值发生更改,使的大小、位置或内部布局 此组件已受影响。此自动更新不同于 AWT,因为程序通常不再需要调用validate 获取要更新的GUI内容。