Создание новых ImageView в JavaFX и Scenebuilder - PullRequest
0 голосов
/ 26 мая 2020

Я собираюсь попробовать еще раз ... Я новичок в Scenebuilder и пытаюсь создать фотогалерею для своего проекта! Я добавил то, что хотел, то есть ImageView с изображением, выбранным из FileChooser ... Но теперь я хотел бы получить совет, как сохранить это и создавать новое при каждом нажатии кнопки addPhoto, а не перезаписать тот, который у меня уже есть в ImageView. вот мой код для кнопки addPhoto:

@FXML

public void initialize(ActionEvent e) throws Exception{


        addPhotos.setOnAction(event -> {
            FileChooser chooser = new FileChooser();
            File file = chooser.showOpenDialog(null);
           pic = new Image(file.toURI().toString());
           if(pic != null) {
             ImageView  imgView = new ImageView(pic);

           }

             imgView.setImage(pic);

    });

F XML Код:

    <BorderPane prefHeight="737.0" prefWidth="934.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="legioDesk.GalleryController">
   <top>
      <Button fx:id="addPhotos" mnemonicParsing="false" onAction="#initialize" text="addPhotos" BorderPane.alignment="CENTER" />
   </top>
   <center>
      <TilePane fx:id="tp" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <children>
            <ImageView fx:id="imgView" fitHeight="306.0" fitWidth="378.0" pickOnBounds="true" preserveRatio="true" />
         </children>
      </TilePane>
   </center>
</BorderPane>

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Вы создаете новый ImageView в своем обработчике событий, но никогда ничего не делаете с ним, поэтому он просто отбрасывается.

Обратите внимание, что оба ImageView имеют одинаковое имя переменной: область действия, которую вы создаете (и отбрасываете), ограничена блоком if, поэтому тот, который вы ссылаетесь за пределами блока, является тем, который вы определяете в файле F XML.

Итак, ваш код

@FXML

public void initialize(ActionEvent e) throws Exception{


    addPhotos.setOnAction(event -> {
        FileChooser chooser = new FileChooser();
        File file = chooser.showOpenDialog(null);
        pic = new Image(file.toURI().toString());
        if(pic != null) {
           // Create a new image view, containing the selected image
           // (but do nothing with it)
           ImageView  imgView = new ImageView(pic);

        }
        // now update the existing ImageView (from the FXML file) with
        // the chosen image:
        imgView.setImage(pic);

    });
}

Что вы хотите сделать (я предполагаю, поскольку вы не очень четко объяснили желаемое поведение), это добавить новое представление изображения на панель плитки:

@FXML

public void initialize(ActionEvent e) throws Exception{


    addPhotos.setOnAction(event -> {
        FileChooser chooser = new FileChooser();
        File file = chooser.showOpenDialog(null);
        pic = new Image(file.toURI().toString());
        if(pic != null) {
           ImageView  imgView = new ImageView(pic);
           imgView.setFitWidth(306);
           imgView.setFitHeight(378);
           imgView.setPreserveRatio(true);
           tp.getChildren().add(imgView);
        }
    });
}

и конечно, вам не нужен просмотр изображений в файле F XML:

<BorderPane prefHeight="737.0" prefWidth="934.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="legioDesk.GalleryController">
   <top>
      <Button fx:id="addPhotos" mnemonicParsing="false" onAction="#initialize" text="addPhotos" BorderPane.alignment="CENTER" />
   </top>
   <center>
      <TilePane fx:id="tp" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
      </TilePane>
   </center>
</BorderPane>
1 голос
/ 26 мая 2020

Хорошо, поскольку вы говорите, что версия с одним изображением работает, и теперь вы хотите добавить новое изображение. Возьмите TilePane, возьмите дочерние элементы и добавьте представление изображения.

pic = new Image(file.toURI().toString());
if(pic != null) {
    ImageView  nextView = new ImageView(pic);
    tp.getChildren().add(nextView);
}
//delete this it is changing the original one.
//imgView.setImage(pic);

Это может сработать, но я не могу проверить его, потому что вы не предоставили достаточно кода.

...