因此,我编写了一个代码,单击框架南部区域的按钮后,将得到一个矩形。
但是由于这个原因,代码在点击按钮后似乎无法正常工作
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();
}
现在代码可以正常工作,但是从我一直研究的地方来看,他们没有使用
revalidate()
并且他们的代码可以工作。为什么会这样呢?
最佳答案
因此,您引用的示例是使用自定义绘制方法来绘制组件。这不会(直接)影响组件的大小或位置,因此不需要容器执行新的布局遍历。
有关更多详细信息,请参见Performing Custom Painting和Painting in Swing
您的代码正在向容器添加一个新组件,因此您需要告诉容器何时要重新放置容器。
因此,从JavaDocs
public void revalidate()支持延迟自动布局。来电
无效,然后将此组件的validateRoot添加到以下列表中
需要验证的组件。毕竟会进行验证
当前已调度未决事件。换句话说之后
调用此方法时,将在以下情况下找到第一个validateRoot(如果有)
沿着该组件的容纳层次结构前进是
已验证。默认情况下,JRootPane,JScrollPane和JTextField返回
从isValidateRoot返回true。
当出现以下情况时,将自动在此组件上调用此方法:
属性值会发生变化,例如尺寸,位置或内部布局
此组件已受到影响。此自动更新与
AWT,因为程序通常不再需要调用验证
获取要更新的GUI的内容。