Как передать путь файла от кнопки FileChooser к другой кнопке?

Я пытаюсь создать программу с несколькими фильтрами изображений, используя JavaFx, поэтому мне нужно, по крайней мере, две кнопки: одна - это средство выбора файлов, чтобы открыть изображение, а другая - поле выбора, позволяющее выбрать фильтр.

Моя проблема в том, как поле выбора может получить путь к файлу или объект файла из средства выбора файлов.

вот моя программа незаконченная:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.layout.*;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Filter extends Application{

    public void start(final Stage stage) {
        stage.setTitle("FilterShop");

        final FileChooser fileChooser = new FileChooser();
        final Button openButton = new Button("Select a photo");

        ChoiceBox<String> choiceBox = new ChoiceBox<>();
        choiceBox.getItems().add("Choose a Filter");

        choiceBox.getItems().addAll("Remove watermark", "Brightness", "Grey", "Mosaic");
        choiceBox.getSelectionModel().selectFirst();
        final Pane stac = new Pane();

        openButton.setOnAction(e -> {
            File file = fileChooser.showOpenDialog(stage);
            if (file != null) {
                Image image = new Image(file.toURI().toString());
                ImageView imageView = new ImageView(image);
                imageView.setX(50);
                imageView.setY(50);

                imageView.setFitWidth(300);
                imageView.setFitHeight(470);

                imageView.setPreserveRatio(true);
                stac.getChildren().add(imageView);
            }
        });

        choiceBox.setOnAction(event1 -> {
            if (choiceBox.getValue() == "Mosaic") {
                try {
                    BufferedImage imagen = ImageIO.read(/* A file object is needed here. */ );
                    new Mosaic().mosaico(imagen, 80, 80);
                } catch (IOException ie) {
                    System.err.println("I/O Error");
                    ie.printStackTrace(System.err);
                }
            }
        });

        openButton.setLayoutX(300);
        openButton.setLayoutY(350);
        choiceBox.setLayoutX(430);
        choiceBox.setLayoutY(350);
        stac.getChildren().addAll(openButton, choiceBox);
        stage.setScene(new Scene(stac, 800, 400));
        stage.show();
    }

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

1 ответ

Решение

Я не уверен, с какой именно проблемой вы сталкиваетесь. Во-первых, FileChooser не является кнопкой. Это вспомогательный класс для взаимодействия с ToolKit, который открывает средство выбора файлов для конкретной ОС и возвращает результаты. И, очевидно, он не будет вести учет возвращенных результатов.

Это ваша обязанность сохранить ссылку на найденный файл. Это можно сделать несколькими способами. Поскольку ваш вопрос направлен на получение значения с помощью кнопки открытия, я бы предложил следующий подход.

openButton.setOnAction(e -> {
            File file = fileChooser.showOpenDialog(stage);
            openButton.getProperties().put("FILE_LOCATION", file.getAbsolutePath());
            ...
});
choiceBox.setOnAction(event1 -> {
            if (choiceBox.getValue() == "Mosaic") {
                File file = new File(openButton.getProperties().get("FILE_LOCATION").toString());
            }
        });
Другие вопросы по тегам