【问题标题】:Rendering a single point in a JFreeChart based on the current Value of a Slider根据 Slider 的当前值渲染 JFreeChart 中的单个点
【发布时间】:2014-09-07 14:35:03
【问题描述】:

我还没有像我想的那样深入 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)

但我对方法及其参数完全没有经验,也不知道如何初始化它们。

我的意思是...我从图表中得到了一个图、一个数据集和 2 个系列,我还建议“项目”是要在系列中突出显示的项目的索引,我可以从滑块转换 -价值。

不幸的是,这件事困扰着谷歌,结果令人沮丧,因为我得到的只是我在上面发布在大约 50 个不同页面上的代码(之后我放弃了)。

我想知道...首先我是否要使用正确的方法,并且我很惭愧这样问...如何使用它。

嗯...期待一些答案和...提前致谢。

【问题讨论】:

  • 查看这些 JSlider examples 和引用的十字准线示例 here
  • 请编辑您的问题,添加一个short, complete example,关注您描述的问题。
  • 这正是问题所在......我不知道此时要使用哪种方法,因此我只能发布没有它的代码,这根本没有帮助。我首先需要知道 drawItem(..) 是否是解决我的问题的正确方法 - 我可能完全被误导了,因为我之前从未做过任何类似的事情
  • CrosshairDemo1 可能值得一看。
  • 忘记更新了。我通过添加一个将根据滑块当前显示的值进行调整的 DomainMarker 解决了这个问题。所以啊...我想我现在很好。我在这里很新,但我想对于那些给出最佳答案的人来说有某种奖励功能......而且因为即使我的问题有点......“非结构化”,你也是唯一真正尝试和帮助的人,我不介意给你。所以只要留下一个答案或某事,我会在下次我的时候看到它。

标签: charts jfreechart itemrenderer jslider changelistener


【解决方案1】:

嗯,我现在解决问题的方式与我原本打算的不同,但对我来说效果很好。

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

class1 测试滑块

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 图表

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
        }

    });

}

我尽量保持简短和通用,我希望我没有删减任何重要的内容。 好吧,我还是这个网站的新手,所以...如果我在某个地方犯了错误,请随时告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多