RT-23699: [TextField] Mouse selection goes away when another JavaFX window is clicked diff -r 8b0841afcc45 modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TextFieldBehavior.java --- a/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TextFieldBehavior.java Fri Oct 18 12:30:00 2013 -0700 +++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TextFieldBehavior.java Wed Oct 23 13:31:56 2013 -0700 @@ -27,6 +27,7 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; +import javafx.beans.value.WeakChangeListener; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Bounds; @@ -55,6 +56,8 @@ private TextFieldSkin skin; private ContextMenu contextMenu; private TwoLevelFocusBehavior tlFocus; + private ChangeListener sceneListener; + private ChangeListener focusOwnerListener; public TextFieldBehavior(final TextField textField) { super(textField, TEXT_INPUT_BINDINGS); @@ -74,6 +77,35 @@ } }); + focusOwnerListener = new ChangeListener() { + @Override public void changed(ObservableValue observable, Node oldValue, Node newValue) { + if (newValue == textField) { + if (!focusGainedByMouseClick) { + textField.selectRange(textField.getLength(), 0); + } + } else { + textField.selectRange(0, 0); + } + } + }; + + sceneListener = new ChangeListener() { + private WeakChangeListener weakListener = new WeakChangeListener(focusOwnerListener); + @Override public void changed(ObservableValue observable, Scene oldValue, Scene newValue) { + if (oldValue != null) { + oldValue.focusOwnerProperty().removeListener(weakListener); + } + if (newValue != null) { + newValue.focusOwnerProperty().addListener(weakListener); + } + } + }; + textField.sceneProperty().addListener(new WeakChangeListener(sceneListener)); + + if (textField.getScene() != null) { + textField.getScene().focusOwnerProperty().addListener(focusOwnerListener); + } + // Only add this if we're on an embedded platform that supports 5-button navigation if (com.sun.javafx.scene.control.skin.Utils.isTwoLevelFocus()) { tlFocus = new TwoLevelFocusBehavior(textField); // needs to be last. @@ -116,7 +148,6 @@ trans.getMzx(), trans.getMzy(), trans.getMzz(), trans.getMzt()); } if (!focusGainedByMouseClick) { - textField.selectRange(textField.getLength(), 0); setCaretAnimating(true); } } else { @@ -124,7 +155,6 @@ // releasing the focus => we need to hide the native component and also native keyboard textField.getScene().getWindow().impl_getPeer().releaseInput(); } - textField.selectRange(0, 0); focusGainedByMouseClick = false; setCaretAnimating(false); }