java - 我如何创建一个每 0.1 秒运行一次并且可以向其中传递一个数组的可执行文件

标签 java scheduledexecutorservice

我正在制作游戏。 我创建了一个包含我所有形状的数组。 我需要每 0.1 秒或更小的时间移动一次形状。 同时我的鼠标后面也有一个圆圈。 我需要能够一直跟随我的鼠标移动圆圈,但我还没有找到每秒移动其他圆圈一点点的方法。 当我尝试移动其他圆圈时,它们会在 javaFX 窗口加载之前立即移动。

这是我的数组

我创建了一个圆并将它添加到我的形状数组中

ArrayList<Shape> Objects = new ArrayList<Shape>();

Circle I = ClassObjects.getCircle(randomWidth,randomX,randomY);    
Objects.add(I);

我试过

final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(Timingobjects::myTask, 0, 1, TimeUnit.SECONDS);
}//                                program name, function, wait before start, time before each loop

    private static void myTask() {

        System.out.println("Running");
    }

但是我发现这是一个runnable executor service,所以没有返回值可以传出去,我也无法得到要传入的数组。

我试图查看可调用执行程序服务,但我无法理解如何对其进行编码。

如果有人可以给我一个每 0.1 秒运行一次的可执行文件的示例,并且可以将我的形状数组列表传递给它,以便它可以被更改然后返回。

我将不胜感激。

最佳答案

查看Timeline的使用在甲骨文中 Animation and Visual Effects in JavaFX一个例子的教程。

否则你可以使用 AnimationTimer .

您不需要将数组传递给时间轴或动画定时器,因为节点将存储在场景图中,您可以直接从时间轴或动画定时器事件处理代码中直接操作场景图节点。

例如创建一个每 0.1 秒处理一次的时间轴:

final Timeline timeline = new Timeline();
timeline.setCycleCount(Animation.INDEFINITE);
timeline.getKeyFrames().add(
   new KeyFrame(Duration.millis(100)),
   new KeyValue(node.translateXProperty(), 25))
);
timeline.play();

请注意,JavaFX 中的帧速率在默认情况下以每秒 60 帧的速度处理。因此 .1 秒时间轴不会准确地每 .1 秒调用一次。

还相关:

关于java - 我如何创建一个每 0.1 秒运行一次并且可以向其中传递一个数组的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41572172/

相关文章:

java - 删除具有空值的 treeMap 条目

java - 您可以将 Math.max 与数组一起使用吗?

java - 在 BlackBerry 中获取 NumberFormat 异常

java - 如何反转我的链表?

java - 为什么这个基于数组的 Java 游戏不起作用?

java - 如何知道 Runnable 被安排重复执行

java - 如何配置 JVM 等待而不是抛出 OutOfMemoryError

java - Java ScheduledExecutorService中使用的调度算法

java - 在多个服务器上执行 ScheduledExecutorService

java - 在永无休止的任务上使用 ScheduledExecutorService 时如何执行垃圾收集?