Skip to content

Commit

Permalink
8245053: Keyboard doesn't show when TextInputControl has focus
Browse files Browse the repository at this point in the history
Reviewed-by: jvos
  • Loading branch information
abhinayagarwal authored and Johan Vos committed Jul 30, 2020
1 parent a46b250 commit 5d34d72
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,27 +26,56 @@
package javafx.scene.control.skin;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.beans.value.WeakChangeListener;
import javafx.event.EventHandler;
import javafx.scene.control.TextArea;
import javafx.scene.control.skin.TextAreaSkin;
import javafx.scene.input.MouseEvent;

public class TextAreaSkinAndroid extends TextAreaSkin {

/**************************************************************************
*
* Private fields
*
**************************************************************************/

private final EventHandler<MouseEvent> mouseEventListener = e -> {
if (getSkinnable().isEditable() && getSkinnable().isFocused()) {
showSoftwareKeyboard();
}
};

private final ChangeListener<Boolean> focusChangeListener = (observable, wasFocused, isFocused) -> {
if (wasFocused && !isFocused) {
hideSoftwareKeyboard();
}
};
private final WeakChangeListener<Boolean> weakFocusChangeListener = new WeakChangeListener<>(focusChangeListener);

/**************************************************************************
*
* Constructors
*
**************************************************************************/

public TextAreaSkinAndroid(final TextArea textArea) {
super(textArea);
textArea.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventListener);
textArea.focusedProperty().addListener(weakFocusChangeListener);
}

/***************************************************************************
* *
* Public API *
* *
**************************************************************************/

textArea.focusedProperty().addListener(new ChangeListener<Boolean>() {
public void changed(ObservableValue<? extends Boolean> observable,
Boolean wasFocused, Boolean isFocused) {
if (textArea.isEditable()) {
if (isFocused) {
showSoftwareKeyboard();
} else {
hideSoftwareKeyboard();
}
}
}
});
/** {@inheritDoc} */
@Override public void dispose() {
if (getSkinnable() == null) return;
getSkinnable().removeEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventListener);
getSkinnable().focusedProperty().removeListener(weakFocusChangeListener);
super.dispose();
}

native void showSoftwareKeyboard();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,29 +26,57 @@
package javafx.scene.control.skin;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.beans.value.WeakChangeListener;
import javafx.event.EventHandler;
import javafx.scene.control.TextField;

import com.sun.javafx.scene.control.behavior.TextFieldBehavior;
import javafx.scene.control.skin.TextFieldSkin;
import javafx.scene.input.MouseEvent;

public class TextFieldSkinAndroid extends TextFieldSkin {

/**************************************************************************
*
* Private fields
*
**************************************************************************/

private final EventHandler<MouseEvent> mouseEventListener = e -> {
if (getSkinnable().isEditable() && getSkinnable().isFocused()) {
showSoftwareKeyboard();
}
};

private final ChangeListener<Boolean> focusChangeListener = (observable, wasFocused, isFocused) -> {
if (wasFocused && !isFocused) {
hideSoftwareKeyboard();
}
};
private final WeakChangeListener<Boolean> weakFocusChangeListener = new WeakChangeListener<>(focusChangeListener);

/**************************************************************************
*
* Constructors
*
**************************************************************************/

public TextFieldSkinAndroid(final TextField textField) {
super(textField);

textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
public void changed(ObservableValue<? extends Boolean> observable,
Boolean wasFocused, Boolean isFocused) {
if (textField.isEditable()) {
if (isFocused) {
showSoftwareKeyboard();
} else {
hideSoftwareKeyboard();
}
}
}
});
textField.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventListener);
textField.focusedProperty().addListener(weakFocusChangeListener);
}

/***************************************************************************
* *
* Public API *
* *
**************************************************************************/

/** {@inheritDoc} */
@Override public void dispose() {
if (getSkinnable() == null) return;
getSkinnable().removeEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventListener);
getSkinnable().focusedProperty().removeListener(weakFocusChangeListener);
super.dispose();
}

native void showSoftwareKeyboard();
Expand Down

0 comments on commit 5d34d72

Please sign in to comment.