Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带定时器的“无限”循环_Java_Timer - Fatal编程技术网

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

Java 带定时器的“无限”循环,java,timer,Java,Timer,我想知道这里是否有人知道如何使用定时器制作一个无缝的无止境的形状循环。基本上,我正在尝试创建一组新的移动形状,而当前的一组形状正在移动,因此看起来它只是沿着屏幕顶部无限移动。我在公共int getX{return x;}旁边尝试了if语句,但没有成功。也许可以让第二个计时器与第二组形状链接,并设置延迟时间?但是,我不知道如何开始写第二个计时器,也不知道如何设置延迟,帮帮我吧 有什么解决方案或建议吗 下面是一个示例,请注意,在所有形状通过屏幕后,形状集是如何重新绘制的。这不是我想要的。我想让它看起

我想知道这里是否有人知道如何使用定时器制作一个无缝的无止境的形状循环。基本上,我正在尝试创建一组新的移动形状,而当前的一组形状正在移动,因此看起来它只是沿着屏幕顶部无限移动。我在公共int getX{return x;}旁边尝试了if语句,但没有成功。也许可以让第二个计时器与第二组形状链接,并设置延迟时间?但是,我不知道如何开始写第二个计时器,也不知道如何设置延迟,帮帮我吧

有什么解决方案或建议吗

下面是一个示例,请注意,在所有形状通过屏幕后,形状集是如何重新绘制的。这不是我想要的。我想让它看起来像是沿着屏幕顶部无限平滑地连续运行

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();
    }
}

我真的不知道你的代码中发生了什么,但我重现了你想要的效果。你可以检查一下。它运行

我做的是做了5个不同的X点。您可以使用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();
            }
        });
    }
}

您可以在if子句中尝试此代码

if (x < 80)  
{
    velX = velX;
    x = x + velX;      
}

我本来打算编辑的,但是太乱了。不要对我们大喊大叫。2请对代码、输入/输出和结构化文档(如HTML或XML)使用代码格式。要做到这一点,请选择示例并单击发送的发布/编辑表单上方的{}按钮。对不起,我是该网站的新手。嗯哼,我修正了我的叫喊lol,很抱歉。感谢编辑代码结构的人:DMaybe是因为你每次循环都会启动计时器?你能详细说明一下吗,Obicere?我会继续修改代码。我问这个问题的原因是因为这个代码可以用作参考资料。在中,人们可以详细说明或实现代码,并使用类似的方法创建完全不同和独特的东西。这正是我所寻找的!非常感谢DWY您想创建一组新的形状吗?只需使用一个xpoint数组并循环遍历该数组。我可以很容易地使用相同的代码,但是不用使用不同的x变量,而是使用int[]xPoints数组;很抱歉刚才的评论。早些时候,我只是粗略地看了一下你的答案,并急切地发表了评论。在研究了你的答案之后,这确实是我想要的。我运行了你的代码,我不太明白为什么当位置设置为空时,画面会出现在屏幕外。我很好奇你是否知道如何解决这个问题。只需使用这个frame.setLocationByPlatformtrue;。如果这对你有用,请不要忘记接受答案。下面的复选标记没有改变任何东西,对不起。