Как использовать модальный диалог в этом случае? - PullRequest
0 голосов
/ 26 января 2020

У меня есть вопрос. Мне нужно сделать GridPane с выбором каталога, который затем приведет меня к модальному диалогу с фотографиями. Я не могу понять, как сделать модальное диалоговое окно, которое также должно быть GridPane или HBox ... поэтому вопрос в том, как мне показать модальное диалоговое окно после выбора папки и нажатия кнопки «Показать» ... Большое спасибо!

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;

public class FotoView extends Application {

    @Override
    public void start(Stage primaryStage) {


        TextField tf = new TextField();
        Button b1 = new Button("Search");
        Button b2 = new Button("Show");     
        DirectoryChooser dc = new DirectoryChooser();
        GridPane gp = new GridPane();   


        gp.add(tf, 0 , 0);
        gp.add(b1, 1, 0);
        gp.add(b2, 0, 1);
        b1.setOnAction(e-> dc.showDialog(primaryStage));

        primaryStage.setScene(new Scene(gp))    ;
        primaryStage.show();

}
    public static void main(String[] args) {
        launch(args);
    }
} ```

1 Ответ

0 голосов
/ 26 января 2020

Ниже приведен быстрый пример, когда в первом окне есть кнопка, которая открывает DirectoryChooser. Как только каталог был выбран, открывается второе меньшее окно с Модальностью, установленной на APPLICATION_MODAL. Во втором окне вы можете добавить загруженные изображения и добавить их к GridPane.

import java.io.File;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.DirectoryChooser;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(final String[] args) {
        launch(args);
    }

    @Override
    public void start(final Stage aStage) throws Exception {

        final HBox root = new HBox();
        final Button browseBtn = new Button("Click to open a Directory chooser");
        root.getChildren().add(browseBtn);

        browseBtn.setOnAction(e -> {
            final DirectoryChooser chooser = new DirectoryChooser();
            final File dir = chooser.showDialog(aStage);
            openNewModalStage(aStage, dir);
        });

        final Scene scene = new Scene(root, 500, 500);
        aStage.setScene(scene);
        aStage.show();
    }

    private void openNewModalStage(final Stage aStage, final File aDirectory) {
        final Stage stage = new Stage();
        final GridPane grid = new GridPane();
        final Scene scene = new Scene(grid);

        grid.setStyle("-fx-background-color:black");
        grid.setPrefWidth(400);
        grid.setPrefHeight(400);

        // get your images from 'aDirectory' and add them to your grid pane.
        stage.setScene(scene);
        // set the new windows Modality.
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.show();
    }
} 

Таким образом, вам понадобится всего одна кнопка, и диалоговое окно появится, как только Вы выбрали каталог. Однако, если вам все еще нужна кнопка «Поиск и показ», просто сохраните каталог как переменную, добавьте прослушиватель для кнопки «show», переместите к нему вызов openNewModalStage и удалите второй аргумент.

Редактировать: Кроме того, в зависимости от того, сколько изображений и что именно вы хотите отобразить в модальном окне, вы можете пересмотреть GridPane и использовать TilePane или hbox / vbox внутри панель прокрутки. Это просто мысль, но я не знаю, что вы будете делать с GridPane.

...