首先让我感谢您对此提供的任何指导。我一直在绞尽脑汁让这个工作,并且一直在这里查看很多线程,但没有运气。我是 Java 和 JavaFX 的新手,但有 C# 背景,主要是 MSFT Visual Studio。我目前使用 IntelliJ 作为我的 IDE 平台。
我想做的是(我认为)足够简单:我正在读取并成功解析来自 Arduino 控制器的数据,该控制器正在读取传感器,为功率计提供读数。我的数据采用逗号分隔的形式,并且通过缓冲读取器和串行端口事件,我能够解析一行,string.split 它,然后放入一个数组中(在转换为 Double 之后)。这部分运行良好,从代码中可以看出,我也将其打印到控制台,没有任何问题:
package sample;
import eu.hansolo.enzo.gauge.RectangularGauge;
import gnu.io.*;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.fxml.FXML;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.*;
public class Main extends Application implements SerialPortEventListener {
SerialPort serialPort = null;
private BufferedReader serialIn;
private OutputStream serialOut;
public Double power;
@FXML
private RectangularGauge fwdpower;
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Power Meter");
primaryStage.setScene(new Scene(root, 380, 320));
primaryStage.show();
//
CommPortIdentifier port = CommPortIdentifier.getPortIdentifier("COM60");
CommPort commPort = port.open(this.getClass().getName(), 2000);
serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
serialIn = new BufferedReader(new InputStreamReader((serialPort.getInputStream())));
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
//
}
public static void main(String[] args) {
launch(args);
}
@Override
public void serialEvent(SerialPortEvent e) {
try {
String line = serialIn.readLine();
String[] Values = line.split(",");
power = Double.parseDouble(Values[1]);
System.out.println(power / 5);
} //This works as expected and shows values on console
fwdpower.setValue(power/5); //Shows NOTHING! UGHHHH!
catch (IOException ex) {ex.printStackTrace();
}
}
现在最困难的部分:让我完全沮丧!
我现在正试图从 jfxtras 仪表中驱动仪表。我已经导入了所有正确的库,并在 scenebuilder 中创建了一个非常简单的 GUI。这是创建的 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import eu.hansolo.enzo.gauge.RectangularGauge?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<GridPane alignment="center" hgap="10" vgap="10" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.65" fx:controller="sample.Controller">
<columnConstraints>
<ColumnConstraints />
</columnConstraints>
<rowConstraints>
<RowConstraints />
</rowConstraints>
<children>
<Pane prefHeight="342.0" prefWidth="377.0">
<children>
<RectangularGauge fx:id="fwdpower" layoutX="25.0" layoutY="22.0" minValue="1.0" />
</children>
</Pane>
</children>
</GridPane>
这是控制器:(目前什么都没有,因为我不想有任何按钮或类似的东西......只是显示数据:
package sample;
import eu.hansolo.enzo.gauge.RectangularGauge;
import gnu.io.SerialPortEvent;
import javafx.fxml.FXML;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Controller {
}
我尝试了不同的组合,但量规拒绝显示从串行端口读取的数据。我认为这可能与 GUI 位于与 main 不同的线程上(一直在搜索和阅读)有关,但对于我的生活,我无法弄清楚如何更改我的代码以使这个看似简单的任务工作。我想要的只是让仪表显示数据......我知道我可能正在做一些完全愚蠢的事情......但无法弄清楚这一点。
关于我如何能够实现这一目标的任何想法?
PS:如果我在控制器中创建一个事件处理程序,比如一个按钮,我可以在按下按钮时使仪表以任意值移动。为什么串行事件触发时我不能这样做????
请帮忙!!!!