サムネがコーヒーの記事は書きかけです。

JavaFX FileChooserを使用してファイルを選択する

JavaFXで、FileChooserクラスを使用して、ファイルを選択する方法について考えます。

ファイルを選択と言っても、やっていることはGUIからユーザーが選択したパスを拾ってくるだけなので単純です。

Controller.java

package com.example.demo;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.FileChooser;
import javax.imageio.stream.ImageInputStream;
import java.util.Iterator;
import javax.imageio.ImageReader;
import javax.imageio.ImageIO;
import java.io.File;

import java.io.File;
import java.util.regex.Pattern;

public class Controller {
    @FXML
    Label label;
    String filePath;
    @FXML
    public void importFile(){
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Import File");
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("imagefile", "*.jpg", "*.png","*.tif")
        );
        fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
        File file = fileChooser.showOpenDialog(null);
        if(file != null) {
            System.out.println(file.getPath());
            this.filePath = file.getPath();
            label.setText(this.filePath);
        }
    }
}

app1.java

package com.example.demo;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import java.io.IOException;

public class sliderApp extends Application{

    @Override
    public void start(Stage stage) throws IOException{
        Parent root = FXMLLoader.load(getClass().getResource("scene1.fxml"));
        stage.setTitle("title");
        stage.setScene(new Scene(root,600,400));
        stage.show();
    }
}

scene1.fxml

ボタンクラスを使用して、インポートボタンを作成します。

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<?import javafx.scene.image.ImageView?>
<GridPane xmlns="http://javafx.com/javafx"
          xmlns:fx="http://javafx.com/fxml"
          fx:controller="com.example.demo.Controller"
          prefHeight="400.0" prefWidth="600.0" >

    <Label  fx:id="label" GridPane.rowIndex="0" GridPane.columnIndex="0" text="Filename" />
    <Button GridPane.rowIndex="1" GridPane.columnIndex="0" onAction="#importFile" text="import" />
    <ImageView fx:id="imageView1" fitHeight="105.0" fitWidth="107.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="3" GridPane.rowIndex="2" />

</GridPane>

ファイルインポートからtifファイルの展開まで

ボタンからtifファイルをインポートした後、展開するまでを行なってみます。

ImageExtractクラス

ファイル展開ようのクラスを作成します。

package com.example.demo;
import javax.imageio.stream.ImageInputStream;
import java.util.Iterator;
import javax.imageio.ImageReader;
import javax.imageio.ImageIO;
import java.io.File;

public class ImageExtract {

    public String filePath;
    public int numImage;

    public ImageExtract(String filePath,String outPath){
        this.filePath = filePath;
        this.numImage = 0;

        try{
            ImageInputStream iis = ImageIO.createImageInputStream(new File(filePath));
            if (iis == null || iis.length() == 0){

            }
            Iterator<ImageReader> iterator = ImageIO.getImageReaders(iis);
            if (iterator == null || !iterator.hasNext()) {
                System.out.println("Image file format not supported by ImageIO: " + filePath);
            }

            ImageReader reader = (ImageReader) iterator.next();
            iterator = null;
            reader.setInput(iis);

            this.numImage = reader.getNumImages(true);

            for (int i = 0; i < reader.getNumImages(true); i++) {
                ImageIO.write(reader.read(i), "tif", new File(outPath + i + ".tif"));
                System.out.println(outPath + i + ".tif -> successfully saved." );
            }

        } catch (Exception e){
            System.out.println(e);
        }
    }

    public static void main(String[] args) {
//        ImageExtract imr = new ImageExtract("img1.tif", "");
    }
}

app1.java

上記のクラスに、取得したパスを適用してファイル取得と同時に展開します。

import java.util.regex.Pattern;

public class Controller {
    @FXML
    Label label;
    String filePath;
    @FXML
    public void importFile(){
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Import File");
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("imagefile", "*.jpg", "*.png","*.tif")
        );
        fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
        File file = fileChooser.showOpenDialog(null);
        if(file != null) {
            System.out.println(file.getPath());
            this.filePath = file.getPath();
            label.setText(this.filePath);
            ImageExtract imx = new ImageExtract(this.filePath,"src/main/resources/com/example/demo/");
        }
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です