Java 使用摆动计时器

Java 使用摆动计时器,java,swing,Java,Swing,为什么下面的代码不起作用? 我想创建一个将BuffereImage绘制到JPanel上的应用程序。所以一旦你启动程序,你就会看到它在画图像。我知道你需要摆动计时器,所以我试着实现它们。现在我想让程序在每个水平绘制的像素线x之后休眠。因此,在重新绘制之后,我希望JPanel停止绘制几毫秒,然后绘制下一行。但我做错了什么 提示:方法createPicture提供了一个矩阵,其中包含转换为颜色的int值 public class ImagePanel extends JPanel{ int[]

为什么下面的代码不起作用? 我想创建一个将BuffereImage绘制到JPanel上的应用程序。所以一旦你启动程序,你就会看到它在画图像。我知道你需要摆动计时器,所以我试着实现它们。现在我想让程序在每个水平绘制的像素线x之后休眠。因此,在重新绘制之后,我希望JPanel停止绘制几毫秒,然后绘制下一行。但我做错了什么

提示:方法createPicture提供了一个矩阵,其中包含转换为颜色的int值

public class ImagePanel extends JPanel{
    int[][] matrix = new int[1920][1080];
    private BufferedImage image;
    int x=0,y=0;

    ActionListener taskPerformer = new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
              if(y==1079||x==1919){  //as soon as the image is ready             
                  ((Timer)evt.getSource()).stop();
              }else{
              for(y=0;y<1080;y++){
               for(x=0;x<1920;x++){
                   image.setRGB(x,y,matrix[x][y]);
               }repaint();
               //I want it to sleep here
               }
              } 
              }
      }; 

    public ImagePanel() throws IOException, InterruptedException{
        image = new BufferedImage(1920,1080, BufferedImage.TYPE_INT_RGB);
         createPicture(1920,1080);
          new Timer(200, taskPerformer).start();
       }
现在我想让程序在每个水平绘制的像素线x之后休眠

当您使用计时器时,ActionListener中的所有代码都会在每次计时器触发时执行,您不想在侦听器中使用睡眠。因此,您无法在计时器内执行这两个循环

相反,您需要做的只是在侦听器中增加图像的y值,然后绘制该行的所有像素。所以你只需要一个循环

代码可能类似于:

ActionListener taskPerformer = new ActionListener() 
{
    int y = 0;

    public void actionPerformed(ActionEvent evt) 
    {
        for(x=0;x<1920;x++)
        {
            image.setRGB(x,y,matrix[x][y]);
        }

        repaint();

        y++;

        if (y >= ???)
            ((Timer)evt.getSource()).stop();
    }
}; 
注意,您也不应硬编码x/y值最大值。相反,您可以使用BuffereImage的getWidth和getHeight方法


此外,当您首次创建BuffereImage时,您需要绘制其背景,否则未更改的像素将为黑色。

啊,我明白了,所以您使用计时器作为for循环。我不知道计时器总是反复执行它的actionPerformed方法,直到停止为止。我完全知道。谢谢您: