2013-06-24 69 views
1

我試圖改變光標來表明程序正忙。看起來這應該是非常簡單的,但我一直沒有得到它的正常工作,並在搜索幾個小時後,我還沒有拿出解決方案。這是我想要做的。JavaFX 2忙指示器光標

public class ButtonTest extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
    final StackPane root = new StackPane(); 
    primaryStage.setScene(new Scene(root, 200, 150)); 

    Button button = new Button(); 
    button.setText("Button"); 
    root.getChildren().add(button); 

    primaryStage.show(); 

    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
     // Set the cursor to the wait cursor. 
     root.setCursor(Cursor.WAIT); 
     // Do some work. 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     // Set the cursor back to the default. 
     root.setCursor(Cursor.DEFAULT); 
     } 

    }); 
} 

    public static void main(String[] args) { 
    launch(args); 
    } 
} 

如果我註釋掉的setCursor(Cursor.DEFAULT),之後我按下按鈕,等待5秒然後將光標變爲等待光標。所以它好像在等待睡眠之後,然後執行setCursor(Cursor.WAIT),緊接着是setCursor(Cursor.DEFAULT)。我錯過了什麼?

+0

請參閱相關:[JAVAFX:如何禁用特定時間的按鈕?](http://stackoverflow.com/q/16919727) –

回答

2

你在睡覺主UI線程,它是應該改變光標形狀的線程。您需要在後臺線程上啓動睡眠(或任何昂貴的操作),而主UI線程退出處理方法並返回到UI事件循環,以便光標更改可以變爲活動狀態。

+0

感謝您的答覆。我試過以下,但它也不起作用。我對線程有很少的經驗,我是否做錯了什麼? –

+0

糟糕,請儘快輸入。我創建一個線程,啓動線程,設置等待光標,加入線程並重置光標。但它仍然不起作用。 –

+0

請勿加入!讓處理程序返回。您必須從後臺線程方法內部通過跨線程調用重置光標到UI線程。 – 2013-06-26 17:58:49

1

你有沒有試過Platform.runLater此:

它應該是這樣的:

primaryStage.getScene().setCursor(Cursor.WAIT); 
Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
    doSomethingInteresting(); 
    primaryStage.getScene().setCursor(Cursor.DEFAULT); 
    } 
}); 

這裏的想法很簡單:在原有的事件只是鼠標形狀定義和新的事件計劃將在此之後直接執行操作。