Java frame.revalidate()对于在事件后获取输出是否重要?

Java frame.revalidate()对于在事件后获取输出是否重要?,java,swing,layout,event-handling,Java,Swing,Layout,Event Handling,因此,我编写了一个代码,在单击帧南部区域的按钮后,会得到一个矩形 但由于这个原因,在点击按钮后,代码似乎不起作用 public void actionPerformed(ActionEvent ev){ Drawing d = new Drawing(); frame.add(d); frame.repaint(); } 我在块内添加重新验证 public void actionPerformed(ActionEvent ev){ Drawing d =

因此,我编写了一个代码,在单击帧南部区域的按钮后,会得到一个矩形

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

public void actionPerformed(ActionEvent ev){
    Drawing d = new Drawing();
    frame.add(d);
    frame.repaint();
   }
我在块内添加重新验证

 public void actionPerformed(ActionEvent ev){
    Drawing d = new Drawing();
    frame.add(d);
    frame.revalidate();
    frame.repaint();
   }
现在代码运行得很好,但在我研究的地方,他们没有使用revalidate,他们的代码运行得很好


为什么会发生这种情况?

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

有关详细信息,请参阅和

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

那么从

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

当 属性值发生更改,从而导致 此组件已受到影响。此自动更新不同于 AWT是因为程序通常不再需要调用validate 获取要更新的GUI内容


重新验证调用使容器失效并验证。这将导致容器经历布局过程,根据布局要求更新所有组件的尺寸和位置。Swing是惰性的,也就是说,它不会更新布局,直到您或其他东西触发它,所以,是的,它很重要。为什么你的代码学习工作,不知道,我们没有提到itI我目前正在学习头一版java第二版371页。代码有点不同,但它们没有使用revalidateSo,您链接到的示例使用的是自定义绘制,有关更多详细信息,请参阅和。所有这一切只是改变组件的绘制内容,它不会影响组件或容器中其他组件的大小或位置,因此您不需要重新验证现在我明白了,如果要向框架添加任何组件,您需要通过调用重新验证日期手动更新框架。否则,对于框架中的现有组件,我们不需要这样做。只要对现有组件的更改不影响组件的大小。更改JLabel的文本可能会影响其大小,但好消息是,JLabelsetText可以触发自身更新