javafx 结合jSerialComm的案例
时间: 2024-05-18 07:18:40 浏览: 173
javaFx例子
5星 · 资源好评率100%
以下是一个简单的JavaFX应用程序,结合使用jSerialComm来读取串口数据并在UI界面中展示:
```java
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
import jssc.SerialPortList;
public class SerialMonitor extends Application {
private SerialPort serialPort;
private TextArea textArea = new TextArea();
private ComboBox<String> portComboBox = new ComboBox<>();
private ComboBox<Integer> baudComboBox = new ComboBox<>();
private Button connectButton = new Button("Connect");
private Button disconnectButton = new Button("Disconnect");
private boolean isConnected = false;
@Override
public void start(Stage primaryStage) {
// 初始化UI界面
BorderPane root = new BorderPane();
root.setPadding(new Insets(10, 10, 10, 10));
// 串口设置面板
HBox settingsPanel = new HBox();
settingsPanel.setAlignment(Pos.CENTER);
settingsPanel.setSpacing(10);
ObservableList<String> portList = FXCollections.observableArrayList(SerialPortList.getPortNames());
portComboBox.setItems(portList);
portComboBox.setPromptText("Select Port");
ObservableList<Integer> baudList = FXCollections.observableArrayList(9600, 115200);
baudComboBox.setItems(baudList);
baudComboBox.setPromptText("Select Baud Rate");
connectButton.setOnAction(event -> connect());
disconnectButton.setOnAction(event -> disconnect());
settingsPanel.getChildren().addAll(portComboBox, baudComboBox, connectButton, disconnectButton);
// 数据展示面板
VBox dataPanel = new VBox();
dataPanel.setAlignment(Pos.CENTER);
dataPanel.setSpacing(10);
textArea.setEditable(false);
textArea.setWrapText(true);
dataPanel.getChildren().add(textArea);
// 添加面板到根容器中
root.setTop(settingsPanel);
root.setCenter(dataPanel);
// 创建场景
Scene scene = new Scene(root, 600, 400);
// 显示窗口
primaryStage.setScene(scene);
primaryStage.setTitle("Serial Monitor");
primaryStage.show();
}
// 连接串口
private void connect() {
if (!isConnected) {
String portName = portComboBox.getValue();
int baudRate = baudComboBox.getValue();
serialPort = new SerialPort(portName);
try {
serialPort.openPort();
serialPort.setParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
serialPort.addEventListener(new SerialPortEventListener() {
@Override
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR()) {
try {
String data = serialPort.readString(event.getEventValue());
Platform.runLater(() -> textArea.appendText(data));
} catch (SerialPortException e) {
e.printStackTrace();
}
}
}
});
isConnected = true;
connectButton.setDisable(true);
disconnectButton.setDisable(false);
} catch (SerialPortException e) {
e.printStackTrace();
}
}
}
// 断开串口
private void disconnect() {
if (isConnected) {
try {
serialPort.removeEventListener();
serialPort.closePort();
isConnected = false;
connectButton.setDisable(false);
disconnectButton.setDisable(true);
} catch (SerialPortException e) {
e.printStackTrace();
}
}
}
// 应用程序入口
public static void main(String[] args) {
launch(args);
}
}
```
上述代码中,我们创建了一个SerialMonitor类,它继承自JavaFX的Application类。在start()方法中,我们初始化了UI界面,包括串口设置面板和数据展示面板。在connect()方法中,我们使用jSerialComm库打开串口并设置串口参数,然后添加串口事件监听器来接收串口数据。当有数据接收时,我们使用Platform.runLater()方法在UI线程中更新UI界面,将串口数据展示在TextArea组件中。在disconnect()方法中,我们关闭串口并移除串口事件监听器。
总之,这个例子展示了如何在JavaFX应用程序中结合使用jSerialComm来读取串口数据并展示在UI界面中。
阅读全文