Wie ich bereits in meiner ersten Antwort darauf hingewiesen, die virtuelle Tastatur in einem PopupWindow
eingebettet, in einer anderen Phase erstellt und auf der aktuellen Stufe angezeigt.
Die Option -Dcom.sun.javafx.vk.adjustwindow=true
funktioniert und bewegt die Hauptbühne so, dass die Steuerung sichtbar ist und keine Überlappung vorhanden ist.
Wenn sich dieses Eingabesteuerelement jedoch am unteren Ende der Hauptbühne befindet, wird es in die Mitte des Bildschirms verschoben und hinterlässt eine große leere Lücke, die anzeigt, was sich dahinter befindet.
Diese zweite Antwort bietet eine Lösung, um die Hauptbühne nur um den erforderlichen Abstand ohne jede Lücke zu bewegen, wobei auch die Ein-/Ausblendanimationen der virtuellen Tastatur berücksichtigt werden.
Für den Anfang, in unserer Szene, fügen wir eine Button
auf der Mitte, und die TextField
auf der Unterseite. Mit zwei Steuerelementen können wir den Fokus leicht ändern und die Tastatur ein-/ausblenden.
Um die Bühne zu maximieren, verwende ich getVisualBounds()
, damit die Taskleiste sichtbar sein kann.
private PopupWindow keyboard;
private final Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds();
private final Rectangle2D bounds = Screen.getPrimary().getBounds();
private final double taskbarHeight=bounds.getHeight()-visualBounds.getHeight();
@Override
public void start(Stage stage) {
TextField tfComment = new TextField();
tfComment.setPromptText("Enter comment");
BorderPane borderPane = new BorderPane(new Button("Click"));
borderPane.setBottom(tfComment);
Scene scene = new Scene(borderPane);
stage.setScene(scene);
stage.setX(visualBounds.getMinX());
stage.setY(visualBounds.getMinY());
stage.setWidth(visualBounds.getWidth());
stage.setHeight(visualBounds.getHeight());
stage.show();
}
Wir müssen die neue Bühne finden, wenn es angezeigt wird. Auf die gleiche Weise wie Scenic View, werden wir eine veraltete Methode verwenden, um ein gültiges Fenster zu erhalten:
private PopupWindow getPopupWindow() {
@SuppressWarnings("deprecation")
final Iterator<Window> windows = Window.impl_getWindows();
while (windows.hasNext()) {
final Window window = windows.next();
if (window instanceof PopupWindow) {
if(window.getScene()!=null && window.getScene().getRoot()!=null){
Parent root = window.getScene().getRoot();
if(root.getChildrenUnmodifiable().size()>0){
Node popup = root.getChildrenUnmodifiable().get(0);
if(popup.lookup(".fxvk")!=null){
return (PopupWindow)window;
}
}
}
return null;
}
}
return null;
}
Wir diese Methode aufrufen werde, wenn das Textfeld den Fokus erhält:
...
stage.show();
tfComment.focusedProperty().addListener((ob,b,b1)->{
if(keyboard==null){
keyboard=getPopupWindow();
}
});
}
Sobald wir das Fenster, können wir auf Veränderungen in seiner Position hören und die Hauptstufe entsprechend bewegen:
....
stage.show();
//findWindowExecutor.execute(new WindowTask());
tfComment.focusedProperty().addListener((ob,b,b1)->{
if(keyboard==null){
keyboard=getPopupWindow();
keyboard.yProperty().addListener(obs->{
System.out.println("wi "+keyboard.getY());
Platform.runLater(()->{
double y = bounds.getHeight()-taskbarHeight-keyboard.getY();
stage.setY(y>0?-y:0);
});
});
}
});
}
Beachten sie, dass anstelle die Bühne zu bewegen, wird ein weitere Option, es wird die Größenänderung (wenn es genug Platz wi verdünnen Sie die Kontrollen).
Dies wird der Fall sein, wenn das Textfeld den Fokus und die virtuelle Tastatur wird vollständig gezeigt:

es wäre nützlich, einen Screenshot von einem überlappenden –
habe ich eine weitere Erklärung hinzugefügt, denn zur Zeit kann ich keine Bilder auf den Mangel an guten Ruf aufgrund laden – Grega
Versuchen Sie jetzt ein Bild hochladen. –