JFreeChart:缩放图表时添加并同步滚动条(Eclipse 插件/SWT)

2023-12-07

我正在使用 JFreeChart 库在 Eclipse 视图中绘制某些内容,目前我的视图初始化代码如下所示:

@Override
public void createPartControl(Composite parent)
{
    JFreeChart chart = null;

    // Created via different object     
    chart = graph.createLineChart("Test Graph", "x", "y");

    ChartComposite frame = new ChartComposite(parent, SWT.NONE, chart, true);
    frame.setRangeZoomable(false);      
    parent.layout(true);
}

我想在用户放大时向我的图表添加滚动,但到目前为止我找到的所有示例(在演示包中,here以及其他来源)基于处理 JPanes 和 ChartPanel 的 Swing。

我怎样才能实现同样的目标createPartControl()我的观点的函数,我只有一个Composite。是否可以仅在 SWT 中执行此操作,或者我应该将 SWT 与 SWING 或 AWT 混合(需要弄清楚如何)?

谢谢


除了已接受的答案之外,我还想自己发布一个答案,因为我遇到了一些关于SlidingXYDataset:

  1. 该实现允许指定数据集中可以在任何给定时间显示的点数,这对于大多数用例来说都是可以的。但在数据集中数据点稀疏非常均匀的情况下,滑动数据将导致域轴改变其范围。
    例如,如果窗口大小为 5 个数据点,前 5 个数据点为 2 个单位,接下来的 5 个数据点为 20 个单位,则滑动时 X 轴可见范围大小将发生变化。
    因此,您可以看到当所有点都绘制在任意位置时,行为会是什么样子。 这可能是也可能不是期望的行为。就我而言,我需要 X 轴有一个固定的可见范围(例如 200 个单位)并始终保持这样。

  2. 由于某种原因我无法创建SlidingXYDataset给它一个空的XYSeriesCollection/TimeSeriesCollection。我需要从一个空数据集开始并实时更新它,并且我必须首先添加无用的数据。但这可能是因为我做错了什么。


话虽如此,可能有解决方法,但我以与接受的答案不同的方式实现了缩放和滚动条。

此示例还展示了当用户在图表上执行缩放操作时如何同步滑块。


首先:您需要创建一个XYLineChart并设置所需的范围(该示例仅针对 X 轴进行阐述,但也可以应用于 Y 轴)

XYSeries dataset = new XYSeries("my dataset");
XYSeriesCollection datasetCollection = new XYSeriesCollection(dataset);
JFreeChart chart = ChartFactory.createXYLineChart("title", 
                   "x label", 
                   "y label", 
                   datasetCollection, 
                   PlotOrientation.VERTICAL, 
                   true, false, false);

XYPlot plot = chart.getXYPlot();
ValueAxis domainAxis = plot.getDomainAxis();
ValueAxis rangeAxis  = plot.getRangeAxis();

domainAxis.setAutoRange(false);
domainAxis.setFixedAutoRange(300); // 300 units visible at anytime on X axis
domainAxis.setLowerBound(0); // start from 0


其次:您需要将图表和滚动条放在父布局中。在 SWT 中,您可以通过 FormLayout 的用户来执行此操作

// Given that composite is the parent Composite
FormLayout layout = new FormLayout();
composite.setLayout(layout);

chartComposite = new ChartComposite(composite, SWT.NONE, chart, true);
Slider slider = new Slider(composite, SWT.NONE);
sldier.setValues(/* depends on your needs */);

// add the slider to the bottom of the form
FormData sliderLayoutData = new FormData();
sliderLayoutData.left = new FormAttachment(0,0);
sliderLayoutData.bottom = new FormAttachment(100,0);
sliderLayoutData.right = new FormAttachment(100,0);
slider.setLayoutData(sliderLayoutData);

// now add the graphComposite to the form above the slider
FormData graphLayoutData = new FormData();
graphLayoutData.left = new FormAttachment(0,0);
graphLayoutData.right = new FormAttachment(100,0);
graphLayoutData.top = new FormAttachment(0,0);
graphLayoutData.bottom = new FormAttachment(slider);      
chartComposite.setLayoutData(graphLayoutData);    

// refresh the layout
composite.layout(true);

现在,每次移动滑块时,您都需要捕获该事件并根据滑块数据使用 to 方法更改图表的域范围:

  domainAxis.setLowerBound(minimum visible);
  domainAxis.setUpperBound(maximum visible);


第三:最后,您需要通过扩展此对象或在创建新对象时覆盖 ChartComposite 的缩放方法

@Override 
public void zoom(Rectangle selection)
{
  XYPlot plot = (XYPlot) getChart().getPlot();
  Rectangle2D plotArea = new Rectangle2D.Double( getScreenDataArea().x,
          getScreenDataArea().y,
          getScreenDataArea().width,
          getScreenDataArea().height);

  float x1 = (float) plot.getDomainAxis().
                       java2DToValue(selection.x, 
                                     plotArea, 
                                     plot.getDomainAxisEdge());

  float x2 = (float) plot.getDomainAxis().
                       java2DToValue(selection.x + selection.width, 
                                     plotArea, 
                                     plot.getDomainAxisEdge());

  // x1 and x2 will have the points transalted into chart coordinates
    // of the selection the user made for zooming the X axis  
  // you can adjust your chart to show only the selected (zoomed) 
    // information as such
  domainAxis.setLowerBound(x1);
  domainAxis.setUpperBound(x2);

  // and now adjust the slider information so it's 
    // synced to your graph's current view
  sldier.setValues(/* depends on your needs */);
}

希望这个实现可以在其他人的用例中找到它的用途。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JFreeChart:缩放图表时添加并同步滚动条(Eclipse 插件/SWT) 的相关文章

  • 在 Android ADT Eclipse 插件中滚动布局编辑器

    有谁知道当布局编辑器的内容溢出一个 屏幕 时如何滚动这些内容 我说的是在设计时使用 ADT 布局编辑器 而不是在物理设备上运行时滚动 效果很好 关闭 Android 布局编辑器中的剪辑 切换剪辑 按钮位于 Android 布局编辑器的右上角
  • 如何在Eclipse中集成CSS预处理? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 Eclipse 中编辑 SCSS 文件 最好使用语法突出显示 scss files 我发现这些资
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • JScrollPane 中的 JScrollPane

    我有一个JScrollPane 其中有一个JPanel其内容窗格 对此JPanel我添加更小的JPanels 正如预期的那样 如果我添加太多JPanel 会出现一个垂直滚动条 问题是我的小JPanels 包含一个JScrollPane也为了
  • SWT GridLayout 列重叠

    Code final Composite sectionClient toolkit createComposite parent SWT NONE sectionClient setLayout UIHelper getLayoutFor
  • JFreeChart - 具有 2 个图例的颜色问题

    我尝试在图表中创建自定义图例 但当我显示一两个图例时 会发生一些奇怪的情况 当我显示 2 个图例 旧的和新的 时 一切都很好 图例和图表中的颜色受到尊重 但是 当我只想显示新图例时 图例中的颜色受到尊重 但图表中的颜色不再受到尊重 这是我的
  • SWT 设置列高或插入新行

    我目前有一个带有几个 TableColumn 的表 org eclipse swt widgets Table 然而 由于用户界面空间的限制 我遇到了一些问题 举例来说 我有一个名为 目标用户 的表列 并且不能将其命名为其他任何名称 并且必
  • 在 Eclipse Indigo 中安装 ADT 中未找到存储库错误

    当我尝试安装 ADT 时出现此错误 An error occurred while collecting items to be installed session context was profile epp package jee p
  • 使用 Checkstyle Plugin 时从插件调用代码时出现问题:“org.eclipse.jface”

    我正在尝试在 Rational Software Architect 7 0 0 4 上使用 eclipse cs 插件 我最近卸载了旧的 beta2 版本并安装了 beta3 插件本身按照之前的配置工作 但是每当我尝试通过 Windows
  • Eclipse Luna 的速度编辑器插件

    我正在寻找 Eclipse Luna 的 Velocity 编辑器插件 但没有找到 我发现了几个编辑器插件 例如 速度月食 http code google com p veloeclipse 速度编辑器 http sourceforge
  • 枚举我所有的 Eclipse 编辑器?

    我构建了一个简单的 Eclipse 插件 用户可以在其中使用TableViewer数据库资源以在任何这些资源上打开编辑器 因此 用户可能有零个以上正在运行的编辑器实例 是否有 API 可用于获取这些编辑器实例的列表 您可以通过以下方式获取所
  • Java Swing双缓冲

    我刚刚开始使用双缓冲 一切正常 直到我想向屏幕添加 JScrollPane 以便稍后我可以进行一些相机移动 除了 JScrollPane 的 ScrollBar 之外 一切都显示得很好 我的精灵 我希望他们能被展示出来 但是 如果我调整窗口
  • 代码分析器:PMD 和 FindBugs

    1 关于PMD 1 1 如何设置 PMD 检查 以忽略其中一些检查 例如 变量名称太短或太长 删除空构造函数等 如果我这样做 则会出现另一个警告 指出该类必须有一些静态方法 基本上 该类是空的 以供以后开发 我喜欢暂时保留这种状态 1 2
  • JFreeChart MeterPlot

    我目前正在用java做Agent项目 在某些时候 我需要显示一个仪表 例如 电池电量 我的程序中有 5 个代理 每个代理都会创建自己的带有名称的仪表图 但不知何故他们没有更新数据集 或者他们正在更新数据集 只是它没有显示在仪表图上 任何想法
  • 如何在 Java 中使 JFrame 可滚动?

    我有这段代码 我试图在其中安装可滚动面板 JPanel 但我不明白 这是我的代码 public class Sniffer GUI extends JFrame Canvas c new Canvas ConnectorProperties
  • Eclipse 颜色主题:“颜色主题”未显示

    我正在尝试改变我的工作方式 这样我就不会在坐在电脑前 8 个小时后感到头疼 所以我想在 Eclipse 中玩转颜色 看看它是否有帮助 我听说过这个 Eclipse Color Theme 插件的好评 我通过 Eclipse Marketpl
  • 如何在 Java 应用程序中使用系统的文件上下文菜单?

    我想显示文件搜索的结果 我想启用文件选择的上下文菜单 这将是系统的上下文菜单 例如 如果用户右键单击 Windows 中的文件 我想显示带有选项的弹出菜单 Open 打开用 Edit 发给 Copy Cut etc 并且 如果可能的话 该菜
  • 在 Eclipse 中编译 Groovy 文件

    我的 java web 项目包含一些 Groovy 代码 但 Eclipse 无法识别 Groovy 文件 也无法从中生成任何类 我已经在 Eclipse 中安装了 Groovy 插件 在我的 Windows 机器中安装 Groovy 并设
  • 如何将 Eclipse Classic 升级到 Java EE?

    我想开发 HTML5 网站 我已经安装了用于Android开发的Java 我的机器上安装了 Eclipse Classic 3 6 现在我希望在同一台机器上安装 Java EE 是否可以 如果是这样 请告诉我如何将 Eclipse Clas

随机推荐