gpt4 book ai didi

java - 如何在 for 循环中延迟程序而不出现异常?

转载 作者:行者123 更新时间:2023-12-01 18:36:20 25 4
gpt4 key购买 nike

我需要在 for 循环结束时等待,然后再重新开始,但我已经搜索过,没有一个方法适用于我的程序。该程序将图像从一侧移动到另一侧。 for 循环如下所示:

int xSize = ((int) tk.getScreenSize().getWidth());  
int ySize = ((int) tk.getScreenSize().getHeight());

for (int finalX = xSize - 128; finalX == 0; finalX-=50)
{
for (int i = 0; i < 11; i += 1)
{
int Min = 64;
int Max = ySize - 200;
int finalY = Min + (int)(Math.random() * ((Max - Min) + 1));
g.drawImage(image3, finalX, finalY, imageWidth, imageHeight, this);

<b>//wait here</b>
}
}

是的,我已经导入了所有内容。我尝试过 try/catch、异常等等,但都不起作用。我该如何执行此操作才能使我的程序仍然可以运行并且会等待?

最佳答案

因为这一行:

g.drawImage(image3, finalX, finalY, imageWidth, imageHeight, this);

这看起来是一个 Swing 或 AWT GUI,因为您正在使用 Graphics 对象进行绘图(您应该向我们提供有关您的问题的重要细节),如果是这样,这已经在这里和其他地方进行了很好的讨论:

  1. 不要使用 for 循环。
  2. 不要使用Thread.sleep(...)
  3. 而是使用 Swing Timer 进行延迟,并在计时器的 ActionListener 中设置将用于为绘图设置动画的类字段。
  4. 并在 JPanel 或从 JComponent 扩展的其他类的 paintComponent(Graphics g) 重写中进行绘图。
  5. 并记住在上面的覆盖中调用 super.paintComponent(Graphics g)

您的实现细节将完全取决于您的问题的详细信息,以及您可能希望传递给我们的其他内容。有关如何使用 Swing Timers 的一般回顾,请查看 Swing Timer Tutorial .

<小时/>

编辑
例如...

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class TimerEg extends JPanel {
private static final int PREF_W = 600;
private static final int PREF_H = PREF_W;
private static final String ICON_PATH = "https://duke.kenai.com/iconSized/duke4.gif";
private static final int TIMER_DELAY = 400;

private BufferedImage imageSprite = null;
private Random random = new Random();
private int finalX;
private int finalY;

public TimerEg() throws IOException {
URL imgUrl = new URL(ICON_PATH);
imageSprite = ImageIO.read(imgUrl);

int maxX = PREF_W - imageSprite.getWidth();
int maxY = PREF_H - imageSprite.getHeight();
new Timer(TIMER_DELAY, new TimerListener(this, maxX, maxY)).start();
}

public void setSpriteLocation(int x, int y) {
finalX = x;
finalY = y;
repaint();
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (imageSprite != null) {
g.drawImage(imageSprite, finalX, finalY, this);
}
}

@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}

private class TimerListener implements ActionListener {
private TimerEg timerEg;
private int maxX;
private int maxY;

private TimerListener(TimerEg timerEg, int maxX, int maxY) {
this.timerEg = timerEg;
this.maxX = maxX;
this.maxY = maxY;
}

@Override
public void actionPerformed(ActionEvent e) {
int currentX = random.nextInt(maxX);
int currentY = random.nextInt(maxY);
timerEg.setSpriteLocation(currentX, currentY);
}
}

private static void createAndShowGui() {
TimerEg mainPanel = null;
try {
mainPanel = new TimerEg();
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}

JFrame frame = new JFrame("TimerEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

它显示了一个 Sprite 在 GUI 上随机移动,看起来像:

enter image description here

关于java - 如何在 for 循环中延迟程序而不出现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21843970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com