为什么立刻重绘(长)重绘?

时间:2009-12-10 17:12:00

标签: java swing repaint

根据Javadoc,JComponent.repaint(long)应该在将来的某个时间安排重绘()。当我尝试使用它时,它总是触发立即重绘。我做错了什么?

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Repaint
{
  public static final boolean works = false;

      private static class CustomComponent extends JPanel
  {
    private float alpha = 0;

    @Override
    protected void paintComponent(Graphics g)
    {
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D) g;
      g2d.setComposite(
        AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
      g2d.setPaint(Color.BLACK);
      g2d.fillRect(0, 0, getWidth(), getHeight());
      alpha += 0.1;
      if (alpha > 1)
        alpha = 1;
      System.out.println("alpha=" + alpha);
      if (!works)
        repaint(1000);
    }
  }

  public static void main(String[] args)
  {
    final JFrame frame = new JFrame();
    frame.getContentPane().add(new CustomComponent());
    frame.setSize(800, 600);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);

    if (works)
    {
      new Timer(1000, new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
        {
          frame.repaint();
        }
      }).start();
    }
  }
}

4 个答案:

答案 0 :(得分:10)

请注意,Javadoc表示该方法将导致重绘在指定时间内 内(而不是之后)发生。

答案 1 :(得分:5)

如果你想安排要重新绘制的东西,那么你应该使用Swing Timer。你不应该使用paintComponnt(..)方法来安排绘画。您无法控制何时调用paintComponent()方法。

答案 2 :(得分:1)

参数说明tm - 更新前的最长时间(以毫秒为单位)它并没有说明它也不会立即这样做javadocs说

  

重新绘制组件。如果这   component是一个轻量级组件,   这导致了对油漆的调用   在tm毫秒内。

答案 3 :(得分:1)

如果稍微搜索,您会发现在派生类中忽略此参数。 ;)