我在JFreeChart - XYLineChart上绘制图像时遇到了困难。主要问题是注释的x和y坐标是实时动态更新的。因此,我的代码添加注释并清除它以便绘制新注释会导致闪烁,这对用户来说很烦人。
我已经使用了使用图形的update(),paint()或repaint()方法检查了JAVA上的一些闪烁问题的例子,但似乎无法在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);
}
}
});
答案 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);
}