【发布时间】:2017-07-28 12:08:44
【问题描述】:
我负责在 Java 中创建一个 GUI,以监控多个地区的多个人的心率(出于保密原因进行了修改)。
一共有8个区域,每个区域包含8个人。这些由 JTabbedPane 指示,每个区域有 1 个选项卡。我正在尝试使用 XChart 库绘制和创建 8 个实时图表。数据将从文本文件中读取并作为两个双精度数组传递。其中一个数组是以毫秒为单位的时间(x 轴),第二个数组是 1 人的心率数据(y 轴)。每个人都将在其相应的区域标签中拥有自己的个人图表。
这类似于在医院里观察几张图表来监控生命体征,从而大致了解这个应用程序应该模拟什么。
我目前使用的是模型-视图-控制器架构。
TLDR; 为了分解它,我只是尝试在 JTabbedPane 内的 JPanel 内的选项卡内添加多个实时 XYChart。但就目前而言,只需添加 ONE 实时图表就可以了。
View.java
private void initComponents() {
jTabbedPane1 = new javax.swing.JTabbedPane();
tabRegion1 = new javax.swing.JPanel();
jTabbedPane1.setTabPlacement(javax.swing.JTabbedPane.BOTTOM);
tabRegion1.setLayout(new java.awt.GridLayout(4, 2));
// Populate the JPanel with empty static graphs
for(int i = 0; i < Global.MAX_GRAPHS; i++)
tabRegion1.add(Graph.getRandomStaticGraph());
jTabbedPane1.addTab("Region 1", tabRegion1);
}
Graph.java(模型)
// Testing purposes
public static JPanel getRandomStaticGraph() {
XYChart chart = getEmptyXYChart();
XYSeries series = chart.addSeries("HeartRate", null, getRandomWalk(200));
series.setMarker(SeriesMarkers.NONE);
return new XChartPanel(chart);
}
// Testing purposes
public static JPanel getRandomRealTimeGraph() throws InterruptedException {
XYChart chart = getEmptyXYChart();
// Show it
final SwingWrapper<XYChart> sw = new SwingWrapper<XYChart>(chart);
sw.displayChart();
double phase = 0;
double[][] initdata = getSineData(phase);
XYSeries series = chart.addSeries("HeartRate", null, getRandomWalk(200));
while(true) {
phase += 2 * Math.PI * 2 / 20.0;
Thread.sleep(100);
final double[][] data = getSineData(phase);
chart.updateXYSeries("sine", data[0], data[1], null);
sw.repaintChart();
}
}
// To be used to generate random static graphs (testing purposes)
private static double[] getRandomWalk(int numPoints) {
double[] y = new double[numPoints];
y[0] = 0;
for(int i = 1; i < y.length; i++)
y[i] = y[i-1] + Math.random() - .5;
return y;
}
// To be used to generate real time graphs (testing purposes)
private static double[][] getSineData(double phase) {
double[] xData = new double[100];
double[] yData = new double[100];
for(int i = 0; i < xData.length; i++) {
double radians = phase + (2 * Math.PI / xData.length * i);
xData[i] = radians;
yData[i] = Math.sin(radians);
}
return new double[][] {xData, yData};
}
资源和我看过的地方
http://knowm.org/how-to-make-real-time-charts-in-java/:这个网站帮助我为实时图创建了一个基类,但无法帮助将它集成到 JPanel 中或如何通过 repaint() 或 update() 使其成为“实时”。并不是说使用 repaint() 或 update() 是必要的。我愿意接受几乎任何建议。
当前环境
- NetBeans IDE 8.2(用于 GUI 生成器)
- Java 1.8.0_111
- XChart JAR (http://knowm.org/open-source/xchart/)
附加说明
我只是无法调用 getRandomRealTimeGraph() 来返回 JPanel 甚至是 XChartPanel,因此我可以将其添加到 JTabbedPane。我会喜欢任何有帮助的建议!
如果这有帮助,则数据已经存在并且正在被解析为 2 个双精度数组。但就目前而言,我并不真正关心作为 x 数据和 y 数据的内容。只要我以后可以替换它,我对任何事情都很满意。
非常感谢!
【问题讨论】:
-
您的
while-true循环有阻塞事件调度线程的危险,从而阻止您的 UI 更新。您可能想要使用SwingWorker或 SwingTimer来执行更新 - 而且,您对 MVC 的想法有点偏离 -
没有更多上下文,很难知道在哪里提供帮助,我的直觉是你的
Graph类是错误的,除了做很多工作之外,它只处理一个图表。您要做的是将数据管理与演示分开。当模型发生更新时,您希望触发对 UI 的请求以更新新数据。这可能需要您拥有多个模型,例如,您可能拥有“原始”模型,然后将其馈入/更新图表模型,然后触发对 UI 的某种更新
标签: java swing user-interface graph jtabbedpane