簡體   English   中英

如何在Javafx中調用子程序之前將錨定窗格設置為可見?

[英]How to set anchor pane visible just before subprogram call in javafx?

以下代碼的目的是處理菜單選項的選擇。 因為方法update()處理需要花費很多時間,所以我想在此之前顯示信息。

我的信息只是一個帶有標簽的錨窗格,通常將其設置為不可見。 不幸的是,下面的代碼將錨定窗格設置為僅在update()終止后的很短時間內可見。 我該怎么做呢?

public void updateRates(ActionEvent event)
{
    updateInfo.setVisible(true);
    update();
    updateInfo.setVisible(false);
}

大多數用戶界面庫都是單線程的。 該線程由UI系統創建並由UI系統控制。 在該線程上調用所有偵聽器。 當UI線程處於阻塞狀態時update()例如,運行update()調用時update() ,UI根本不會重繪,並且鍵盤事件和鼠標事件將在事件隊列中“堆積”,似乎被忽略,直到允許線程繼續運行(這時將立即按順序處理所有線程)。

因此,冗長的操作絕不能在UI線程上執行。 一種選擇是在另一個線程中運行任務

Task<Boolean> updater = new Task<Boolean>() {
    @Override
    public Boolean call() {
        updateValue(true);
        update();
        return false;
    }
};

updateInfo.visibleProperty().bind(updater.valueProperty());

new Thread(updater).start();

您還可以從普通的Runnable創建線程:

updateInfo.setVisible(true);

Runnable updater = new Runnable() {
    @Override
    public void run() {
        update();
        Platform.runLater(() -> updateInfo.setVisible(false));
    }
};

new Thread(updater).start();

在這種情況下,需要Platform.runLater ,因為只能在UI線程中訪問和修改用戶界面對象,包括所有JavaFX節點。 如果您的update()方法正在操縱任何節點,則需要使用Platform.runLater來執行此操作。

Task類具有用於在UI中顯示工作進度的內置支持,但是由於您沒有包括update()方法的代碼,因此我無法告訴您該支持在您的情況下是否有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM