使用计时器在JFreeChart上闪烁XYImageAnnotation

时间:2012-12-12 16:44:25

标签: java timer annotations jfreechart bufferedimage

我在JFreeChart - XYLineChart上绘制图像时遇到了困难。主要问题是注释的x和y坐标是实时动态更新的。因此,我的代码添加注释并清除它以便绘制新注释会导致闪烁,这对用户来说很烦人。

我已经使用了使用图形的update(),paint()或repaint()方法检查了JAVA上的一些闪烁问题的例子,但似乎无法在JFreeChart上实现。

您是否有任何想法如何摆脱闪烁或解决方法在JFreeChart上使用一个bufferedImage而不是注释?

这里更具体的是绘制的线条和图像:

Screenshot

因此,这个十字线(作为缓冲图像)应该使用x和y轴的更新值来上下绘制线。但不幸的是,这种运动导致闪烁。

以下是我绘制图像的代码部分 - 我无法提供SSCCE,因为有超过15个类和5k的编写代码:

// After a button clicked on panel
SomeButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent event) {

        // The chart and XYPlot is already drawn at this point 


        // Reading the image
        try {
            myPicture = ImageIO
                    .read(new File("\\\\Users2\\blabla\\Data\\MyPictures\\x.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Setting up a timer
        timer2 = new java.util.Timer();

        Object source = event.getSource();
        if (source == SomeButton) {

        // Setting up a task
            task2 = new java.util.TimerTask() {
                @Override
                public void run() {
                    double x1;
                    double y1;
                    try {
                        // Getting different x and y values from a microcontroller instantaneously
                        if (microContConnected()) {

                            x1 = microCont.getX();
                            y1 = microCont.getY();

                            // creating the annotation
                            XYImageAnnotation ImageAnn = new XYImageAnnotation(x1, y1, myPicture);

                            // Here is the drawing and clearing made !
                            plot.addAnnotation(ImageAnn);       
                            pause(50);
                            plot.clearAnnotations();    
                        }

                    } catch (SerialPortException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            };
            timer2.scheduleAtFixedRate(task2, 50, 50);
        }
    }
});

1 个答案:

答案 0 :(得分:0)

我似乎找到了解决方案;而不是将图像添加到绘图我使用渲染器,并且在添加和删除具有新坐标的图片之间没有暂停功能..添加和删除的序列也是相反的。我必须说,让我以这种方式工作让我感到惊讶。没有闪烁;它像剪裁的图形或双缓冲一样平滑。 :)这是新代码:

    // renderer
    final XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();

    // Reading the image
    try {
        myPicture = ImageIO.read(new File("\\\\Users2\\blabla\\Data\\MyPictures\\x.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }

    // Setting up a timer
    timer2 = new java.util.Timer();

    Object source = event.getSource();
    if (source == someButton) {

                task2 = new java.util.TimerTask() {
                    @Override
                    public void run() {
                        if (check == true) {
                            if (microContConnected()) {

                                 x1 = microCont.getX();
                                 y1 = microCont.getY();

                                renderer.removeAnnotations();

                                XYImageAnnotation img2 = new XYImageAnnotation(
                                        x1, y1, myPicture);
                                renderer.addAnnotation(img2,
                                        Layer.FOREGROUND);
                            }
                        }
                    }
                };
                timer2.scheduleAtFixedRate(task2, 50, 50);
            }