javafx将并发绘制到许多画布中

时间:2018-09-26 12:28:27

标签: java javafx

我有一个网格窗格,该窗格具有三列(名称,金额,位置)和20行(A,B,C,...)。在第三列中,我为该行的列表中的每个时间戳绘制了一个笔划。在函数中,我仅遍历列表并将时间戳转换为位置。这就是现在的样子。

for (int row = 0; row < timestamps.size(); row++)
{
    drawTimestamps(timestamps.get(row), duration, canvas, row);
}

现在,由于我要显示的记录可能相对较长,因此可能需要一些时间。为了更快地绘制位置,我想到了同时绘制所有行。 我尝试使用AnimationTimer来执行此操作,但这并未按计划进行(我认为我做错了)。这甚至是一种并发绘制多行的方法,还是有其他方法可以更快地做到这一点?

    for (int row = 0; row < timestamps.size(); row++)
    {
        DrawTimer dt = new DrawTimer(timestamps.get(row), duration, canvas, row);
        dt.start();
    }


    private class DrawTimer extends AnimationTimer
    {
        private List<long> timeStamps;
        private int duration;
        private Canvas canvas;
        private int row;

        public DrawTimer(List<Long> timestamps, int duration, Canvas canvas, int row)
        {
            this.timestamps = timestamps;
            this.duration = duration;
            this.canvas = canvas;
            this.row = row;
        }

        @Override
        public void handle(long now)
        {
            drawTimeStamps(timestamps, duration, canvas, row);
            stop();
        }
    }

    private void drawTimestamps(List<Long> timestamps, int duration, Canvas canvas, int row)
    {
        double width = canvas.getWidth();
        double height = canvas.getHeight();

        final GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.setStroke(Color.DARKBLUE);
        for (long timestamp : timestamps)
        {
            double timestampPosition = timestamp * 1d / duration;
            gc.strokeLine(width * timestampPosition, height - height / 2, width * timestampPosition,
                height);
        }
    }

这是将值绘制到画布中时的外观。现在,每个笔划都是一个时间戳,此录音约为7天。第二列显示了有多少个时间戳。

gridpane with timestamps

0 个答案:

没有答案