Java 使用鼠标平移图表-Jfreechart
我们可以在JfreeChart中将平移功能实现为鼠标拖动事件吗?现在我按CTRL键并拖动鼠标来平移图表。我想通过拖动鼠标来实现平移功能。这可能吗?显然不可能使用当前的JFreeChart API更改修改器键,正如前面所讨论的(但它正在准备中) 但是,可以通过编程方式平移图表,因此您可以尝试以下操作:Java 使用鼠标平移图表-Jfreechart,java,jfreechart,Java,Jfreechart,我们可以在JfreeChart中将平移功能实现为鼠标拖动事件吗?现在我按CTRL键并拖动鼠标来平移图表。我想通过拖动鼠标来实现平移功能。这可能吗?显然不可能使用当前的JFreeChart API更改修改器键,正如前面所讨论的(但它正在准备中) 但是,可以通过编程方式平移图表,因此您可以尝试以下操作: 将一个MouseMotionListener添加到ChartPanel以跟踪mouseDragged()事件 根据这些事件,计算图表的请求移动 直接调用XYPlot.panDomainAxes()
- 将一个
添加到MouseMotionListener
以跟踪ChartPanel
事件mouseDragged()
- 根据这些事件,计算图表的请求移动
- 直接调用
和XYPlot.panDomainAxes()
(API)XYPlot.panRangeAxis()
图表面板
中汲取灵感:
这是我的解决办法
问候
助教
解决方案仍然没有提供新版本,所以我把它完美地为我工作,它也自动变焦范围轴时,你滚动:
ChartPanel panel = new ChartPanel(chart);
panel.setMouseZoomable(false);
panel.setMouseWheelEnabled(true);
panel.setDomainZoomable(true);
panel.setRangeZoomable(false);
panel.setPreferredSize(new Dimension(1680, 1100));
panel.setZoomTriggerDistance(Integer.MAX_VALUE);
panel.setFillZoomRectangle(false);
panel.setZoomOutlinePaint(new Color(0f, 0f, 0f, 0f));
panel.setZoomAroundAnchor(true);
try {
Field mask = ChartPanel.class.getDeclaredField("panMask");
mask.setAccessible(true);
mask.set(panel, 0);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
panel.addMouseWheelListener(arg0 -> panel.restoreAutoRangeBounds());
现在,JFreeChart的行为与任何其他专业绘图软件一样 在回答堆栈溢出问题时,最好解释一下代码的作用。因为只有代码才能回答问题的OP可能无法理解
Field mask = ChartPanel.class.getDeclaredField("panMask");
mask.setAccessible(true);
mask.set(yourChartPanel, Integer.valueOf(0)); // The "0" mask is equivalent to no mask. You could also set a different modifier.
ChartPanel cp = new ChartPanel(chart)
{
/**
* A hack to change the zoom and panning function.
* With this override we can pan around by dragging.
* If SHIFT is pressed we get the zoom rectangle.
* @param e
*/
@Override
public void mousePressed(MouseEvent e)
{
int mods = e.getModifiers();
int panMask = MouseEvent.BUTTON1_MASK;
if (mods == MouseEvent.BUTTON1_MASK+MouseEvent.SHIFT_MASK)
{
panMask = 255; //The pan test will match nothing and the zoom rectangle will be activated.
}
try
{
Field mask = ChartPanel.class.getDeclaredField("panMask");
mask.setAccessible(true);
mask.set(this, panMask);
}
catch (Exception ex)
{
ex.printStackTrace();
}
super.mousePressed(e);
}
};
ChartPanel panel = new ChartPanel(chart);
panel.setMouseZoomable(false);
panel.setMouseWheelEnabled(true);
panel.setDomainZoomable(true);
panel.setRangeZoomable(false);
panel.setPreferredSize(new Dimension(1680, 1100));
panel.setZoomTriggerDistance(Integer.MAX_VALUE);
panel.setFillZoomRectangle(false);
panel.setZoomOutlinePaint(new Color(0f, 0f, 0f, 0f));
panel.setZoomAroundAnchor(true);
try {
Field mask = ChartPanel.class.getDeclaredField("panMask");
mask.setAccessible(true);
mask.set(panel, 0);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
panel.addMouseWheelListener(arg0 -> panel.restoreAutoRangeBounds());