2012-02-15 30 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控件的目的是为了获得原生的感觉,而不是定制的外观。当然,我们可以让自己的想法改变,但必须与保持原生感觉的目标保持平衡(其中包括选择所有焦点并且不显示焦点丢失的选择,即使存在选择。但是,既然没有选择焦点,如果它只是选择 - 所有获得的焦点和由于奇怪的边缘情况仍然会因此而存在,我们不得不怀疑是否值得改变它)。