带有定时器的“无限”循环

时间:2013-12-23 08:41:46

标签: java timer

我想知道这里是否有人知道如何使用计时器使用形状进行无缝循环。基本上我正在尝试制作一组​​新的移动形状,而当前的一组形状正在移动,因此看起来它只是沿着屏幕顶部无限移动。我在if旁边尝试了public int getX(){return x;)}语句,但我没有成功。也许有可能让第二个计时器与第二组形状相关联并设置延迟时间? (但是,我不知道如何写第二个计时器,我不知道如何设置延迟,请帮帮我?)

任何解决方案或建议?

这是一个示例,请注意在所有形状通过屏幕后如何重绘这些形状集。这不是我想要的。我希望它看起来好像是顺利连续地沿着屏幕顶部无限运行。

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

public class ExampleLoop extends JPanel implements ActionListener {

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new ExampleLoop());
        frame.setVisible(true);
    }

    Timer timer = new Timer(50, this);
    int x = 0, velX = 7;

    // CHRISTMAS THEME :D
    public void paintComponent(Graphics g) {

        g.setColor(Color.RED);
        g.fillRect(0, 0, 500, 500);
        g.setColor(Color.GREEN);
        for (int z = 0; z <= 500; z += 100)
            g.fillRect(x + z, 0, 20, 20);
        timer.start();
    }

    public void actionPerformed(ActionEvent e) {

        if (x < 500) {
            velX = velX;
            x = x + velX;
        }
        else {
            x = 0;
        }
        repaint();
    }
}

2 个答案:

答案 0 :(得分:1)

我无法弄清楚代码中发生了什么,但我重现了你正在寻找的效果。你可以检查它。它运行。

我做的是制作5个不同的xPoints。你可以通过使用int数组来完成这个,但是我觉得用这种方式读起来会更容易。

对于每个xPoint,我增加了每个计时器迭代次数。如果xPoint达到屏幕宽度,我将其设为0.然后重新绘制。我为所有要点做到了。

代码编辑:使用数组和循环

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class GreenRects extends JPanel {

    private static final int SCREEN_WIDTH = 500;
    private static final int SCREEN_HEIGHT = 500;

    private static final int OFFSET = 100;
    private static final int SIZE = 20;
    private static final int INC = 5;

    int[] xPoints = new int[5];

    public GreenRects() {
        int x = 0;
        for (int i = 0; i < xPoints.length; i++) {
            xPoints[i] = x;
            x += OFFSET;
        }

        Timer timer = new Timer(50, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < xPoints.length; i++) {
                    if (xPoints[i] + INC < SCREEN_WIDTH) {
                        xPoints[i] += INC;
                    } else {
                        xPoints[i] = 0;
                    }
                }

                repaint();
            }
        });
        timer.start();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setColor(Color.red);
        g.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

        g.setColor(Color.green);
        for (int i = 0; i < xPoints.length; i++) {
            g.fillRect(xPoints[i], 0, SIZE, SIZE);
        }
    }

    public Dimension getPreferredSize() {
        return new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT);
    }

    public static void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.add(new GreenRects());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);

    }

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

enter image description here

答案 1 :(得分:1)

您可以在if子句

中尝试此代码
if (x < 80)  
{
    velX = velX;
    x = x + velX;      
}