是否有一种方法可以使用Java中的Timer类使图形组件从一个点过渡到另一个点?

问题描述 投票:0回答:1

我正在尝试使用Timer类在Java中顺利地制作简单的动画,即target从其当前位置水平移动到最远的帧末尾。] >>

我在Timer类的actionPerformed()方法中使用了图形组件的当前位置,并已将组件的x位置增加了一定数量,但是当我尝试运行它时,该组件会立即跳至下一个位置并等待计时器完成并重新绘制到新位置。 ((如果我没有正确说明问题,我深表歉意。)

我已将代码作为一个整体包含在内,以提供整个上下文:

public class FireAtBill extends JPanel {
    private static final long serialVersionUID = 4682094035006759518L;

    private int hits, misses;
    private Point targetPos;
    private Timer t;
    private BufferedImage crosshair, target;


    public FireAtBill() {

        Random random = new Random();
        targetPos = new Point(random.nextInt(500),random.nextInt(500) );
        t = new Timer(500, new TimerListener());
        t.start();

        setForeground(Color.WHITE);
        setBackground(Color.BLACK);

        try {
            crosshair = ImageIO.read(new File(System.getProperty("user.dir")+ "/crosshair.jpg"));
            target = ImageIO.read(new File(System.getProperty("user.dir")+ "/target.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.drawString("hits: " + hits + "  misses: " + misses, 0, 10);
        g2.drawImage(crosshair, 125, 50, this);
        g2.drawImage(target, targetPos.x, targetPos.y, this);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Fire At Bill");
        frame.setSize(500,500 );
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        FireAtBill fireAtBill = new FireAtBill();
        frame.getContentPane().add(fireAtBill);
        frame.setVisible(true);
    }

    private class TimerListener implements ActionListener{
        double x = targetPos.getX();
        public void actionPerformed(ActionEvent event) {
            if (x <= 500||targetPos.getX() >= 0) {
                if (x<250) {
                    targetPos.setLocation(targetPos.getX()+15, targetPos.getY());
                }
                else {
                    targetPos.setLocation(targetPos.getX()-15, targetPos.getY());
                }
            }
            repaint();
        }

    }

}

我希望target在屏幕上水平平滑移动,但是target正在从一个位置跳到另一个位置。我尝试使用较小的值增加xtarget位置,虽然这可以平滑移动,但这样做的代价是以target的速度为代价,我希望将其实现为可以通过更改其值进行更改。预先感谢。

我正在尝试使用Timer类在Java中顺利完成一个简单的动画,即将目标从其当前位置水平移动到最远的帧末尾。我用过图形...

java swing actionlistener
1个回答
0
投票

[好,我发现通过减小初始化Timer对象时的延迟值,可以通过将t = new Timer(500, new TimerListener());更改为500之类的东西来加快此处50的重新绘制过程。 减小此值将加快动画的速度。

© www.soinside.com 2019 - 2024. All rights reserved.