2012-02-15 66 views
1

選擇一個字下面的代碼應該在一個JavaFX TextField選擇一個單詞:在TextField中

public class NewFXMain extends Application { 

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

    @Override 
    public void start(Stage primaryStage) { 
     final TextInputControl textField = new TextField("Hello World, World!"); 

     Button button = new Button("select"); 
     button.setOnAction(new EventHandler<ActionEvent>() { 

      public void handle(ActionEvent t) { 
       textField.positionCaret(0); 
       textField.selectNextWord(); 

       System.out.println(textField.getSelectedText()); 
      } 
     }); 

     VBox root = new VBox(); 
     root.getChildren().add(textField); 
     root.getChildren().add(button); 
     primaryStage.setScene(new Scene(root, 300, 100)); 
     primaryStage.show(); 
    } 
} 

選中它打印在控制檯Hello,但是在接口沒有(高亮)。 如果對TextArea執行相同操作,則會正確選擇文本。

的(錯誤)與TextField結果:

enter image description here

而且(正確)與導致一個TextArea

enter image description here

這是怎麼回事?!?

+0

看到我的答案,並讓我知道它是否正在工作...... – 2012-02-15 09:40:22

回答

3

TextField不顯示選擇,除非它有焦點(雖然我不確定它是一個錯誤還是功能)。您可以通過使用下面的代碼見的選擇:

button.setOnAction(new EventHandler<ActionEvent>() { 

     public void handle(ActionEvent t) { 
      textField.requestFocus(); // get focus first 
      textField.positionCaret(0); 
      textField.selectNextWord(); 

      System.out.println(textField.getSelectedText()); 
     } 
    }); 
+0

我的用例是一個拼寫檢查器,所以它是一個不同的模式窗口,顯示建議,而不同的TextFields/TextAreas突出顯示拼寫錯誤的單詞 - 這意味着它不是因爲焦點在拼寫檢查器本身上,所以要求將焦點集中到被選中的TextInputControl上非常簡單。有什麼建議麼? – Marcelo 2012-02-15 12:36:33

+0

將拼寫檢查限制爲TextAreas而不是TextFields + TextAreas,或者檢查http://openjdk.java.net/projects/openjfx/上的代碼並查看是否可以修復該問題的修補程序。 – jewelsea 2012-02-16 02:40:49

1

的問題的答案是,我們在這方面的本地控制的理解是,他們都明確選擇當文本字段失去焦點,他們(通常)選擇所有文本獲得焦點時。我們在JavaFX中使用UI控件的目的是爲了獲得原生的感覺,而不是定製的外觀。當然,我們可以讓自己的想法改變,但必須與保持原生感覺的目標保持平衡(其中包括選擇所有焦點並且不顯示焦點丟失的選擇,即使存在選擇。但是,既然沒有選擇焦點,如果它只是選擇 - 所有獲得的焦點和由於奇怪的邊緣情況仍然會因此而存在,我們不得不懷疑是否值得改變它)。