gpt4 book ai didi

java - 挥杆计时器未按预期运行

转载 作者:行者123 更新时间:2023-11-30 03:19:31 27 4
gpt4 key购买 nike

有人建议我不要使用 sleep 来暂停,而是使用 swing timer 但它仍然不起作用。我想要的动画实现是一个球从左上角沿对角线向下移动。

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

class Show_starter {

int x, y;
JFrame window = new JFrame("Graphic_show");
Graphic_panel jp = new Graphic_panel();

public static void main(String[] args) {
Show_starter start = new Show_starter();
start.go();
}

private void go() {
window.getContentPane().add(BorderLayout.CENTER, jp);
window.setSize(600,800);
window.setVisible(true);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

class Graphic_panel extends JPanel {

public void paintComponent(Graphics g) {

for ( int i = 0; i < 100; ++i) {
g.setColor(Color.white);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.green);
g.fillOval(x, y, 40, 40);

x++;
y++;

try {

Timer tmr = new Timer(1000, new TimerListener()); //This fires an event after every 1 sec after it has started by start().
//But The ball travels too much fast and stops at a point and again travels very fast.
tmr.serRepeats(false); // even this is not working.
tmr.start();
//should i use repaint here or in Listener for this timer?
} catch (Exception e){}
}
}

class TimerListener implements ActionListener {

public void actionPerformed(ActionEvent e) {
jp.repaint();
}
}
}
}

它所显示的行为是非常奇怪的,球首先以非常高的速度移动,并在某个点处短暂停止,然后再次以相同的速度移动。

我还尝试更改 timer 事件的触发时间,但发生了同样的事情。

即使在我启动计时器的循环内,后续函数调用也不起作用

setRepeats(false);

最佳答案

不要总是创建新的计时器,一个计时器就足够了。减少计时间隔。1秒对于动画来说太慢了。您不需要循环,也不要在paintcomponet内增加x和y () 方法,因为此方法会因某种原因被调用,例如当您调整大小、最小化、最大化时。

意外的行为是由于您的循环和创建新的计时器()造成的。例如,在 x y 中从零开始,但在第一秒 x y 在下一次绘制中增加到 100,100,您会看到它们处于 100,100 的位置。这看起来像是快速移动然后停止...

示例代码(已编辑)

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Show_starter {

private Timer tmr;

int x, y;
JFrame window = new JFrame("Graphic_show");
Graphic_panel jp = new Graphic_panel();

public static void main(String[] args) {

Show_starter start = new Show_starter();
start.go();

}

private void go() {

window.getContentPane().add(BorderLayout.CENTER, jp);
window.setSize(600, 800);
window.setVisible(true);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tmr = new Timer(10, new ActionListener() { // time gap in millisecond

@Override
public void actionPerformed(ActionEvent ae) {

jp.increse();
jp.repaint();
}
});
tmr.start();

}

class Graphic_panel extends JPanel {

public void increse() {
x++;
y++;
if (x > 100) { // stop animation at x>100
tmr.stop();
}
}

public void paintComponent(Graphics g) {

g.setColor(Color.white);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.green);
g.fillOval(x, y, 40, 40);

}

}
}

输出(比这更平滑)

enter image description here

关于java - 挥杆计时器未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677503/

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