[英]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.