我如何创建一个每0.1秒运行一次的可执行文件,并且可以将一个数组传递给它

时间:2017-01-10 15:18:29

标签: 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");
    }

但我发现这是一个可运行的执行程序服务,因此不会传递任何返回值,我也无法传入数组。

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

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

我将非常感激。

2 个答案:

答案 0 :(得分:1)

有关示例,请参阅Oracle Timeline教程中Animation and Visual Effects in JavaFX的使用。

否则您可以使用AnimationTimer

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

例如,创建一个每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秒。

也相关:

答案 1 :(得分:0)

可以使用Article.where('date < ?', Time.now)。像TimerTask那样延伸:

TimerTask

不要尝试返回任何值。使用观察者模式通知订阅者。

现在

class CustomTimerTask extends TimerTask  {
    List<Shape> shapes;

    public CustomTimerTask(List<Shape> shapes, /* observers*/) {
       this.shapes = shapes;
    }

    @Override
    public void run() {
       // update shapes
       // notify( about mouse events or whatever)
    }
}