1

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

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

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

更具体地说,这里是画线和图像:

截屏

所以这个十字准线(作为缓冲图像)应该随着 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);
        }
    }
});
4

1 回答 1

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);
            }
于 2012-12-14T17:07:03.860 回答