2009-12-10 70 views
1

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

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(); 
    } 
    } 
} 

回答

10

注意的Javadoc说方法会导致重绘到(不是之后)在规定的时间发生。

+0

在撰写本文时,Sun的JDK似乎完全忽略了“tm”参数。所有具体实现都将参数传播到它们的容器,但没有人使用它。 – Gili 2010-12-29 14:24:20

1

参数表示TM - 以毫秒为单位的最大时间更新它并没有说不会做之前,所以也即刻的javadoc说

重绘组件。如果此 组件是一个轻量级组件,则会导致在tm毫秒内调用 。

+4

JPanel是轻量级的。重量级组件是那些与同龄人(AWT画布,面板,窗口,框架,对话框,TextField,TextArea,列表,复选框等)。 – 2009-12-10 17:44:34

+0

感谢您的澄清我要编辑答案希望多数民众赞成 – 2009-12-11 12:24:22

5

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

+1

使用计时器是真正的唯一途径。如果您尝试在PaintComponent()内部安排绘画,则在窗口环境中移动其他组件或程序时,组件或程序在组件或程序上移动时不会立即重新绘制组件。 – clartaq 2009-12-11 14:40:28

1

如果您搜索了一下,您会发现该参数在派生类中被忽略。 ;)