基于Slider的当前值在JFreeChart中渲染单个点

时间:2014-09-07 14:35:04

标签: charts jfreechart itemrenderer jslider changelistener

我还没有像我一样喜欢Java,所以我觉得我当前的任务有点挑战:

  • 显示在另一个班级收集的数据的图表。
  • 一个滑块,其结束值由图表中使用的数据集中的最后一个条目确定。
  • 播放按钮目前无法执行任何操作,只是让滑块按5的步长打勾,直到再次暂停。

我现在的问题是:我应该根据滑块当前显示的值,一次突出显示一个项目。

说实话......我还没有习惯于渲染器。

如果我理解正确,我需要使用

 renderer.drawItem(java.awt.Graphics2D g2,
          XYItemRendererState state,
          java.awt.geom.Rectangle2D dataArea,
          PlotRenderingInfo info,
          XYPlot plot,
          ValueAxis domainAxis,
          ValueAxis rangeAxis,
          XYDataset dataset,
          int series,
          int item,
          CrosshairState crosshairState,
          int pass)

但我完全缺乏对方法和参数的认识,也不知道如何初始化它们。

我的意思是......我从图表中得到了一个情节,一个数据集和两个系列,我还建议" item"将是系列中要突出显示的项目的索引,我可以从滑块值转换。

不幸的是,谷歌关于它的事情变得相当令人沮丧,因为我得到的是我在上面发布的大约50个不同页面上的代码(我放弃了之后)。

我想知道......首先,如果我甚至要使用正确的方法,并且像我一样惭愧地问这样......如何使用它。

嗯...期待一些答案......并提前感谢。

1 个答案:

答案 0 :(得分:0)

好吧,我现在以一种与我想要的不同的方式解决了我的问题,但它对我来说很合适。

我只是添加一个可根据滑块当前显示的值进行调整的域标记,而不是突出显示曲线中的一个点。

class1 TestSlider

private HashSet<SliderListener> sliderListenerSet = new HashSet<SliderListener>();

public void addSliderListener(SliderListener Listener){
    sliderListenerSet.add(Listener);
}

slider.addChangeListener(this);

public void stateChanged(ChangeEvent e) {
    // TODO Auto-generated method stub
    JSlider source = (JSlider)e.getSource();
    if (!source.getValueIsAdjusting()) {
            fireSliderChanged();
    }
} 

public void fireSliderChanged(){
    for (SliderListener currentListener : sliderListenerSet)
        currentListener.sliderValueChanged();
}

class2 SliderListener

public interface SliderListener extends EventListener{

public void SliderValueChanged();
}

class3 Chart

Marker marker = new ValueMarker(0);
plot.addDomainMarker(marker); //so that it would be there at the beginning
TestSlider ts = new TestSlider();

ts.addSliderListener(new SliderListener(){

        @Override
        public void sliderValueChanged() {

            plot.removeDomainMarker(marker); //I only want one of them at a time - the one with the value the slider is currently showing so remove the old one...
            marker = new ValueMarker(ts.slider.getValue());
            plot.addDomainMarker(marker); // ... and add the one with the new value
        }

    });

}

我尽量保持它尽可能简短和普遍,我希望我没有删除任何重要的东西。 好吧,我还是这个网站的新手,所以...如果我在某个地方犯了错误,请随时告诉我。