所有人。 我有一個程序,它應該自動控制一些機器。我需要javaFX來顯示研討會的臨時狀態。有幾個進程一個接一個地執行,對於他們中的每一個我需要更新屏幕上的圖像(讓我們更簡單一點,說我們需要更新標籤)。從另一個線程javafx更新ImageView
所以,有一個主線程,它控制着機器,並且有一個FX應用程序線程,它控制GUI。
public static void main(String[] args) {
//some processes in the main thread before launching GUI (like connecting to the database)
Thread guiThread = new Thread() {
@Override
public void run() {
DisplayMain.launchGUI();
}
};
guiThread.start();
//some processes after launching the GUI, including updating the image on the screen
}
我讀了一大堆的材料,這裏SO和對甲骨文的文檔,現在我不能弄明白所有這些綁定的,可觀察性,Platform.runLater,任務,檢索控制器,通過控制器作爲參數傳遞給某個類等
我有一個FXML文件,讓我們說這隻能說明一個標籤:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.Label?>
<GridPane alignment="center"
hgap="10" vgap="10"
xmlns:fx="http://javafx.com/fxml/1"
xmlns="http://javafx.com/javafx/8"
fx:controller="sample.Controller">
<columnConstraints>
<ColumnConstraints />
</columnConstraints>
<rowConstraints>
<RowConstraints />
</rowConstraints>
<children>
<Pane prefHeight="200.0" prefWidth="200.0">
<children>
<Label fx:id="label" text="Label" />
</children>
</Pane>
</children>
</GridPane>
有連接到它的控制器。我認爲這是我們應該聽取圖像變化或其他事情的地方。
package sample;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.image.ImageView;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
@FXML
public void initialize(URL location, ResourceBundle resources) {
//some listeners?
}
@FXML
private Label label;
public void setlabel(String s) {
label.setText(s);
}
}
還有一個Display.java用作啓動機制。
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Display extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(loader.load(), 800, 400));
primaryStage.show();
}
static void launchGUI() {
Application.launch();
}
}
最後,問題是:如何從main()更新控制器中的標籤?有很多信息如何在控制器之間傳遞數據,如何調用控制器中的方法,但我完全失去了我的問題。