JavaFX อัปเดต UI จากเธรดอื่น

ฉันมีเรียนวิชาหลัก

    public class Main {
        public static void main(String[] args) {
            Application.launch(View.class);
            View view = new View();
            Platform.runLater(() -> view.changeTitle());
        }
    }

และคลาส JavaFX ดู

    public class View extends Application {

        Stage primaryStage;

        public View() {

        }

        @Override
        public void start(Stage primaryStage) throws Exception{
            Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
            primaryStage.setTitle("Hello World");
            primaryStage.setScene(new Scene(root, 300, 275));
            this.primaryStage = primaryStage;
            primaryStage.show();
        }

        public void changeTitle() {
           primaryStage.setTitle("YEA!");
       }
    }

ฉันต้องการให้คลาสหลักทำอะไรบางอย่างในเธรด JavaFX แต่โค้ดของฉันใช้งานไม่ได้ ในเอกสารบอกว่าฉันสามารถเรียก Platform.runLater() จากเธรดใดก็ได้ที่ฉันต้องการ ถ้าฉันเรียก Platform.runLater() จากเธรด JavaFX (ใน start() เป็นต้น) ทุกอย่างก็โอเค


person WildWind03    schedule 23.04.2016    source แหล่งที่มา


คำตอบ (1)


ขั้นแรก main(String) ถูกบล็อกใน Application.launch(Class)

จาก Oracle Javadocs:

วิธีการเปิดใช้จะไม่ส่งคืนจนกว่าแอปพลิเคชันจะออกแล้ว ไม่ว่าจะผ่านการเรียกไปที่ Platform.exit หรือปิดหน้าต่างแอปพลิเคชันทั้งหมดแล้ว

ประการที่สอง คุณกำลังสร้างอินสแตนซ์ View ใหม่บนบรรทัดที่สอง นั่นจะไม่ใช่อินสแตนซ์เดียวกับที่แอปพลิเคชันสร้างขึ้น ดังนั้น Platform.runLater ของคุณจะไม่ส่งผลกระทบต่อแอปพลิเคชันที่เปิดใช้งาน แม้ว่าจะสามารถเข้าถึงโค้ดนั้นได้ก่อนที่จะออกก็ตาม

person Gordon    schedule 23.04.2016