向 JFreeChart 添加水平滚动
Add horizontal scroll to JFreeChart
如标题所述:如何向使用 JFreeChart 创建的烛台图表添加水平滚动条?我希望用户在放大时能够水平滚动图表。现在放大有效,但我不能向左或向右移动。我尝试将 ChartPanel 放入 JScrollPane 但那是一个图表面板,而不是图表本身。我的自定义 ChartPanel 构造函数:
public MyChartPanel(JFreeChart chart) {
super(chart);
lineDrawingControllers =new EventListenerList();
this.setMouseZoomable(false);
this.addMouseListener(mouseHandler);
this.addMouseMotionListener(mouseHandler);
this.setPopupMenu(null);
this.linePopupMenu=new JPopupMenu();
linePopupMenuListener=new LinePopupMenuListener();
}
我的自定义 Jpanel,我在其中创建了 Chart 和 ChartPanel,并将 ChartPanel 放在 JScrollPane 中:
public MyCandleStickChart() {
ohlcSeries = new OHLCSeries("Test data");
ohlcSeriesCollection = new OHLCSeriesCollection();
ohlcSeriesCollection.addSeries(ohlcSeries);
ohlcSeries=ohlcSeriesCollection.getSeries(0);
chart= ChartFactory.createCandlestickChart("Default Chart", "Time", "Value", ohlcSeriesCollection, true);
chart.getXYPlot().setOrientation(PlotOrientation.VERTICAL);
chartPanel=new MyChartPanel(chart);
chartPanel.setDisplayToolTips(false);
jScrollPane=new JScrollPane(chartPanel);
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
add(jScrollPane);
add(tooltipPanel);
}
然后我将 MyCandleStickChart JPanel 添加到主应用程序框架:
myCandleStickChart=new MyCandleStickChart();
applicationFrame.add(myCandleStickChart, BorderLayout.CENTER);
如果您在 XYPlot
上调用 setDomainPannable(true)
,您实际上可以左右移动它。在你的情况下看起来像 chart.getXYPlot().setDomainPannable(true)
。还有一种方法setRangePannable(boolean pannable)
分别在范围方向进行平移。当我很久以前使用它时,这导致能够通过拖动鼠标中键来移动图表。我不知道现在你的行为会是什么 :) 但如果你没有其他想法,这种方法是一个很好的起点。可能是如果您在那里查看源代码,那么您可以为相同的功能创建自己的自定义滚动条。
Upd.: 或者,您可以 increase/decrease 通过鼠标滚轮或其他方式自行调整 ChartPanel 的大小,而无需使用 JFreeChart 的缩放功能。然后 JScrollPane 将完成这项工作。如果您只想在全球范围内扩展,这很好也更容易。但是如果你想要很好地缩放用户选择的区域,那么我会考虑自定义 JFreeChart 的 "panning".
Upd2.: 我对鼠标中键的理解可能是错误的。可能是 CTRL
+ 鼠标拖动,就像在 @trashgod
提供的 link 中一样
如标题所述:如何向使用 JFreeChart 创建的烛台图表添加水平滚动条?我希望用户在放大时能够水平滚动图表。现在放大有效,但我不能向左或向右移动。我尝试将 ChartPanel 放入 JScrollPane 但那是一个图表面板,而不是图表本身。我的自定义 ChartPanel 构造函数:
public MyChartPanel(JFreeChart chart) {
super(chart);
lineDrawingControllers =new EventListenerList();
this.setMouseZoomable(false);
this.addMouseListener(mouseHandler);
this.addMouseMotionListener(mouseHandler);
this.setPopupMenu(null);
this.linePopupMenu=new JPopupMenu();
linePopupMenuListener=new LinePopupMenuListener();
}
我的自定义 Jpanel,我在其中创建了 Chart 和 ChartPanel,并将 ChartPanel 放在 JScrollPane 中:
public MyCandleStickChart() {
ohlcSeries = new OHLCSeries("Test data");
ohlcSeriesCollection = new OHLCSeriesCollection();
ohlcSeriesCollection.addSeries(ohlcSeries);
ohlcSeries=ohlcSeriesCollection.getSeries(0);
chart= ChartFactory.createCandlestickChart("Default Chart", "Time", "Value", ohlcSeriesCollection, true);
chart.getXYPlot().setOrientation(PlotOrientation.VERTICAL);
chartPanel=new MyChartPanel(chart);
chartPanel.setDisplayToolTips(false);
jScrollPane=new JScrollPane(chartPanel);
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
add(jScrollPane);
add(tooltipPanel);
}
然后我将 MyCandleStickChart JPanel 添加到主应用程序框架:
myCandleStickChart=new MyCandleStickChart();
applicationFrame.add(myCandleStickChart, BorderLayout.CENTER);
如果您在 XYPlot
上调用 setDomainPannable(true)
,您实际上可以左右移动它。在你的情况下看起来像 chart.getXYPlot().setDomainPannable(true)
。还有一种方法setRangePannable(boolean pannable)
分别在范围方向进行平移。当我很久以前使用它时,这导致能够通过拖动鼠标中键来移动图表。我不知道现在你的行为会是什么 :) 但如果你没有其他想法,这种方法是一个很好的起点。可能是如果您在那里查看源代码,那么您可以为相同的功能创建自己的自定义滚动条。
Upd.: 或者,您可以 increase/decrease 通过鼠标滚轮或其他方式自行调整 ChartPanel 的大小,而无需使用 JFreeChart 的缩放功能。然后 JScrollPane 将完成这项工作。如果您只想在全球范围内扩展,这很好也更容易。但是如果你想要很好地缩放用户选择的区域,那么我会考虑自定义 JFreeChart 的 "panning".
Upd2.: 我对鼠标中键的理解可能是错误的。可能是 CTRL
+ 鼠标拖动,就像在 @trashgod