Keyboard on focused Control hold by AWT under GTK [message #1805317] |
Thu, 11 April 2019 14:22 |
Patrick Muscat Messages: 14 Registered: May 2018 |
Junior Member |
|
|
Hello,
Under GTK 2.24.32 or 3.22.30:
This little piece of code shows how the Swing / AWT text field keeps the focus for keyboard events once it obtains it. It should release keyboard focus when the Text (SWT) or the TextField (JavaFX) are focused.
The mouse focus is ok (including the selection paste using middle button) event if the keyboard focus is held by the JTextField.
The keyboard focus is ok when completely leaving the program window.
Under win32, the keyboard focus follows correctly the mouse focus.
SWT fragment version is org.eclipse.swt.gtk.linux.x86_64_3.106.0.v20170608-0516.jar
I suppose the problem is in SWT_AWT but is is also linked with GTK, any help or clue will be appreciated.
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.embed.swt.FXCanvas;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import java.awt.Frame;
import java.awt.KeyboardFocusManager;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.internal.gtk.OS;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class JavaFXAndAWTInsideSWT {
public static void main(String[] args) {
// Print GTK version.
System.out.println(
"GTK Version: " + OS.gtk_major_version() + "." + OS.gtk_minor_version() + "." + OS.gtk_micro_version());
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
// SWT
Composite composite = new Composite(shell, SWT.FILL);
composite.setLayout(new GridLayout());
Text text = new Text(composite, SWT.NONE);
text.addFocusListener(new org.eclipse.swt.events.FocusListener() {
@Override
public void focusGained(org.eclipse.swt.events.FocusEvent arg0) {
System.out.println("focusGained (SWT)");
}
@Override
public void focusLost(org.eclipse.swt.events.FocusEvent arg0) {
System.out.println("focusLost (SWT)");
}
});
text.setText("Text");
// JavaFX
FXCanvas fxCanvas = new FXCanvas(shell, SWT.NONE);
TextField textField = new TextField("Text");
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
System.out.println(newValue ? "focusGained (JavaFX)" : "focusLost (JavaFX)");
}
});
Group group = new Group(textField);
Scene scene = new Scene(group);
fxCanvas.setScene(scene);
// AWT
JPanel jPanel = new JPanel();
JTextField jTextField = new JTextField("Text", 20);
jTextField.addFocusListener(new java.awt.event.FocusListener() {
@Override
public void focusGained(java.awt.event.FocusEvent e) {
System.out.println("focusGained (AWT)");
}
@Override
public void focusLost(java.awt.event.FocusEvent e) {
System.out.println("focusLost (AWT)");
}
});
jPanel.add(jTextField);
Composite embedded = new Composite(shell, SWT.EMBEDDED);
Frame frame = SWT_AWT.new_Frame(embedded);
frame.add(jPanel);
KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
focusManager.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
System.out.println("focus property changes: " + e.getPropertyName());
}
});
shell.layout();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.05651 seconds