FULL PRODUCT VERSION :
ADDITIONAL OS VERSION INFORMATION :
Linux Xavier 4.4.0-53-generic #74-Ubuntu SMP Fri Dec 2 15:59:10 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
In RichTextFX (https://github.com/TomasMikula/RichTextFX/issues/280), a custom built text area that does not extend `TextInputControl` cannot input special characters on Linux-based OS. However, special characters can be inputted on Windows or Mac OS
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
In the given source code, press the Compose key, the ` key, and the A key. Then click on the TextArea and do the same thing.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The Strings outputted from the key events should be the same, indicating that a special character was inputted, not the composition keys that composed it.
ACTUAL -
The code treats each composition key event as a regular keys being pressed. It does not interpret the key presses as a special-character-input event.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class SpecialArea extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Circle rtfxArea = new Circle(50);
TextArea jfxArea = new TextArea();
// output the column headers
outputColumnHeaders();
// setup listener
EventHandler<KeyEvent> output = e -> {
StringBuilder sb = new StringBuilder();
String type = e.getEventType().toString();
sb
.append(type.substring(4, type.length()))
.append("\t").append(e.getCharacter())
.append("\t").append(e.getCode())
.append("\t").append(e.getText())
.append("\t").append(e.isControlDown())
.append("\t").append(e.isShiftDown())
.append("\t").append(e.isAltDown())
.append("\t").append(e.isMetaDown())
.append("\t").append(e.isShortcutDown());
System.out.println(sb.toString());
};
// add event filter
rtfxArea.addEventFilter(KeyEvent.ANY, output);
jfxArea.addEventFilter(KeyEvent.ANY, output);
Scene scene = new Scene(new VBox(rtfxArea, jfxArea), 500, 500);
// re-output headers on S and switch to other area
scene.addEventHandler(KeyEvent.KEY_RELEASED, e -> {
if (e.getCode() == KeyCode.S) {
System.out.println("\n--- Switching to next area ---\n");
outputColumnHeaders();
if (rtfxArea.isFocused()) {
jfxArea.requestFocus();
} else {
rtfxArea.requestFocus();
}
e.consume();
}
});
primaryStage.setScene(scene);
primaryStage.show();
rtfxArea.requestFocus();
}
private void outputColumnHeaders() {
StringBuilder sb = new StringBuilder();
sb.append("Event Type")
.append("\tChar")
.append("\tCode")
.append("\tText")
.append("\tCTRL")
.append("\tSHIFT")
.append("\tALT")
.append("\tMETA")
.append("\tSHORT");
System.out.println(sb.toString());
}
}
---------- END SOURCE ----------