Странное поведение javafx.scene.control.Dialog на Android - PullRequest
0 голосов
/ 30 мая 2019

Модальное диалоговое окно (например, диалоговое окно входа в систему) прокручивается вверх, когда виртуальная клавиатура появляется после того, как текстовое поле имеет фокус, и текстовое поле исчезает за пределами диалогового окна.

У меня есть диалоговое окно входа, которое отображается скнопка.Когда текстовое поле получает фокус, виртуальная клавиатура прокручивает сцену диалога за пределами области диалогов.Так исчезает половина диалога и невозможно увидеть, что вы печатаете.Другая половина диалогового этапа остается белой и пустой.Протестировано на 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);
    }

}

Я ожидаю, что текстовые поля диалога остаются видимыми, когда появляется виртуальная клавиатура.Я заметил, что это ожидаемое поведение иногда верно, но часто нет, я не знаю почему.Я протестировал скрытие и показ клавиатуры, изменение фокуса, нажатие кнопки отмены и т. Д., И полученный диалог изменяется.(Я не могу загрузить скриншоты).

...