Модальное диалоговое окно (например, диалоговое окно входа в систему) прокручивается вверх, когда виртуальная клавиатура появляется после того, как текстовое поле имеет фокус, и текстовое поле исчезает за пределами диалогового окна.
У меня есть диалоговое окно входа, которое отображается скнопка.Когда текстовое поле получает фокус, виртуальная клавиатура прокручивает сцену диалога за пределами области диалогов.Так исчезает половина диалога и невозможно увидеть, что вы печатаете.Другая половина диалогового этапа остается белой и пустой.Протестировано на Android 4.4 и 8.0
Некоторые изображения:
Вот код диалога контроллера:
public class DialogController implements Initializable {
private Dialog<Map<String, String>> dialog = new Dialog<>();
@FXML
private AnchorPane dialogview;
@FXML
private PasswordField password;
@FXML
private TextField txtTerminal;
DialogController() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("logindialog.fxml"));
fxmlLoader.setController(this);
dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
dialog.setGraphic(null);
dialog.setHeaderText(null);
try {
dialogview = fxmlLoader.load();
} catch (IOException exception) {
Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, exception);
}
dialog.getDialogPane().setContent(dialogview);
Optional<Map<String, String>> result = dialog.showAndWait();
if (result.isPresent()) {
verificar();
}
password.setText("");
txtTerminal.setText("");
dialog.hide();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
Node botonOK = dialog.getDialogPane().lookupButton(ButtonType.OK);
((Button) botonOK).setPrefSize(100, 40);
Node botonCANCEL = dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
((Button) botonCANCEL).setPrefSize(100, 40);
dialog.setResultConverter(dialogButton -> {
if (dialogButton == ButtonType.OK) {
HashMap<String, String> respuesta = new HashMap<>();
respuesta.put("terminal", txtTerminal.getText());
respuesta.put("password", password.getText());
return respuesta;
}
return null;
});
Platform.runLater(() -> txtTerminal.requestFocus());
}
private void verificar() {
}
}
Файл:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="dialogview" prefWidth="250.0" style="-fx-background-color: linear-gradient(#5264AE, white);" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
<BorderPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<center>
<GridPane alignment="center" hgap="3" vgap="3">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
<columnConstraints>
<ColumnConstraints halignment="LEFT" maxWidth="Infinity" minWidth="100.0" prefWidth="120.0">
</ColumnConstraints>
<ColumnConstraints hgrow="ALWAYS" maxWidth="Infinity" minWidth="120.0" prefWidth="180.0">
</ColumnConstraints>
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="30.0" prefHeight="30.0" />
<RowConstraints minHeight="30.0" prefHeight="30.0" />
</rowConstraints>
<children>
<Label text="Terminal:">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Label>
<Label text="Clave" GridPane.rowIndex="1">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Label>
<TextField fx:id="txtTerminal" GridPane.columnIndex="1">
<font>
<Font size="14.0" />
</font>
</TextField>
<PasswordField fx:id="password" GridPane.columnIndex="1" GridPane.rowIndex="1">
<font>
<Font size="14.0" />
</font>
</PasswordField>
</children>
</GridPane>
</center>
</BorderPane>
</AnchorPane>
Иприложение:
public class Prudialog extends Application {
private AnchorPane root;
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Login");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
DialogController termcontroller = new DialogController();
}
});
VBox vbox = new VBox(btn);
AnchorPane.setLeftAnchor(vbox, 0.0);
AnchorPane.setTopAnchor(vbox, 0.0);
AnchorPane.setRightAnchor(vbox, 0.0);
AnchorPane.setBottomAnchor(vbox, 0.0);
root = new AnchorPane();
root.getChildren().add(vbox);
Rectangle2D pantalla = Screen.getPrimary().getVisualBounds();
Scene scene = new Scene(root, pantalla.getWidth(), pantalla.getHeight());
primaryStage.setTitle("Dialog Test");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
Я ожидаю, что текстовые поля диалога остаются видимыми, когда появляется виртуальная клавиатура.Я заметил, что это ожидаемое поведение иногда верно, но часто нет, я не знаю почему.Я протестировал скрытие и показ клавиатуры, изменение фокуса, нажатие кнопки отмены и т. Д., И полученный диалог изменяется.(Я не могу загрузить скриншоты).