Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

堀北真希さん誕生日を祝ってJavaFXで画像ビューアを作ってみる

今日は堀北真希さん25歳の誕生日!

デビュー当時から堀北真希さんを応援してるのでかれこれ10年(>_<)

今日は写真集「Dramatic」の発売記念と合わせて、久々の握手会イベントがあったとのこと…残念ながら抽選外れましたが orz

今や飛ぶ鳥を落とす勢いな堀北さん、その可愛さのあまり、気が付けば自分のマシンに画像も溜まっているわけです…(別に仕事中に集めてるわけじゃないからねっ)

ということで、そういうフォルダを指定したら、その配下を走査して画像表示する簡易ビューアみたいなのをJavaFXで作ってみました(^^)

JavaFXやってみる

JavaFXをまともに触ったことなく、先日JJUGでハンズオンイベントが行われた際の資料を家でやったぐらいの私…(^^;(一応ブログ書いてた)

JavaFXハンズオンにお家でChallenge!

でもJavaOne2013の基調講演を生でみたら何か色々触ってみたい気持ちが強くなったので、やってみることに(^^)/

環境

せっかくなのでわりと新しい環境でやってみました。

OS:Windows 8 Professional
IDE:NetBeans7.4RC1
JDK:8 Early Access
Tool:SceneBuilder1.1

できたもの

先に動かしたプログラムの結果から(^^;

実行するとウィンドウが出てきて、堀北さんの写真が表示されます。

f:id:kikutaro777:20131006223559j:plain

かわいいですね(^^)

f:id:kikutaro777:20131006223604j:plain

少し薄くなってもかわいい(^^)

f:id:kikutaro777:20131006223609j:plain

待って、まだみていたい!

f:id:kikutaro777:20131006223614j:plain

あー消えてしまう…。

f:id:kikutaro777:20131006223727j:plain

けど次っ!

f:id:kikutaro777:20131006223741j:plain

と、5秒間、フェードアウトするように薄くなっていき、3秒停止して次の画像へ。が延々と繰り返されます。

それだけ(^^;

f:id:kikutaro777:20131006223749j:plain

昔の写真も

f:id:kikutaro777:20131006223753j:plain

かわいいですね(^^)笑

フォルダは以下のような感じで整理されてません(^^;

f:id:kikutaro777:20131006223921j:plain

コード

作る前に「こんなことやらねばー」というのを挙げたら

  • 画像表示
  • フォルダ配下にある画像を(再帰的に)走査
  • アニメーション

という感じでした。ざっくり仕様ですが。

で、ほとんど以下の@skrbさん記事に辿り着いて終わりました…(^^;なんと

で、とりあえず書いてみたのがこんな感じ。

package javafxsample;

import java.io.IOException;
import java.net.URL;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javafx.animation.Animation;
import javafx.animation.FadeTransition;
import javafx.animation.PauseTransition;
import javafx.animation.SequentialTransition;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.util.Duration;

public class MakiMakiViewerController implements Initializable {
    
    /**
     * 画像表示エリア
     */
    @FXML
    private ImageView photo;
    
    /**
     * 画像パスのリスト
     */
    private List<String> imageList;
    
    /**
     * 連続アニメーション
     */
    private SequentialTransition transition;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        //写真格納フォルダのトップを指定
        Path photoPathRoot = Paths.get("D:\\photo\\horikita");
        
        //画像を総なめしてパスをかき集める
        imageList = new ArrayList<>();
        FileVisitor<Path> visitor = new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                imageList.add(file.toUri().toString());
                return FileVisitResult.CONTINUE;
            }
        };
        
        try {
            Files.walkFileTree(photoPathRoot, visitor);
        } catch (IOException ex) {
            System.out.println("画像読み込みの途中でエラーが起きました。");
        }
        
        //繰り返すアニメーションを一旦リストする
        List<Animation> listAnime = new ArrayList<>();
        
        imageList.stream().forEach((imagePath) -> {
            photo.setImage(new Image(imagePath));
            
            //フェードアニメーション
            FadeTransition fade = new FadeTransition(Duration.millis(5000));
            fade.setFromValue(1.0);
            fade.setToValue(0.1);
            fade.setAutoReverse(true);
            fade.setCycleCount(1);
            fade.setNode(photo);
            
            //ポーズアニメーション 終了時に画像ファイル読む
            PauseTransition pause = new PauseTransition(Duration.millis(3000));
            pause.setOnFinished((ActionEvent t) -> {
                photo.setImage(new Image(imagePath));
            });
            listAnime.add(fade);
            listAnime.add(pause);
        });

        //上記フェードとポーズの連続アニメーションとする
        Animation[] arrAnime = new Animation[listAnime.size()];
        transition = new SequentialTransition(listAnime.toArray(arrAnime));
        
        //アニメーションを繰り返す
        transition.setCycleCount(Animation.INDEFINITE);
        
        //アニメーション実行
        transition.play();
    }    
    
}

画像ファイルの判定とかしないと…ですが、とりあえず(^^)

せっかくなので色々機能を付け加えていこうかな~と。

しばらくChallenge JavaFXになりそう…?

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村
QLOOKアクセス解析