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