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

但是由于这个原因,代码在点击按钮后似乎无法正常工作

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 PaintingPainting in Swing

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

因此,从JavaDocs


  public void revalidate()支持延迟自动布局。来电
  无效,然后将此组件的validateRoot添加到以下列表中
  需要验证的组件。毕竟会进行验证
  当前已调度未决事件。换句话说之后
  调用此方法时,将在以下情况下找到第一个validateRoot(如果有)
  沿着该组件的容纳层次结构前进是
  已验证。默认情况下,JRootPane,JScrollPane和JTextField返回
  从isValidateRoot返回true。
  
  当出现以下情况时,将自动在此组件上调用此方法:
  属性值会发生变化,例如尺寸,位置或内部布局
  此组件已受到影响。此自动更新与
  AWT,因为程序通常不再需要调用验证
  获取要更新的GUI的内容。

09-05 19:14