簡単なミュージックプレーヤーをさらにいじってみた

JavaFX Advent Calendar 2017の18日目です。15日目に改造したミュージックプレーヤーをさらに強化してみました。

強化ポイント1 再生・一時停止・曲送りボタン

再生ボタンを再生・一時停止のトグルボタンに変えて、iTunesと同じような感じに仕上げました。ボタンはCSSiTunes風のデザインに変えてみました。再生が終わると再生・一時停止ボタンは元に戻ります。

f:id:planet-az:20171215231832p:plain

強化ポイント2 マウスとキーボードのイベント

ListViewの曲選択に、マウスとキーボードを使えるようにしました。以前も開始前にマウスで曲選択できるようにはなっていたのですが、今回のは再生中に違う曲を選ぶと、再生中の曲を止めて新しく選んだ曲を再生するようにしました。曲送りボタンを押下したときも同じ動作です。マウスはOnMouseClicked、キーボードはOnKeyReleasedをそれぞれ処理しています。最初はOnKeyReleasedとOnKeyPressedとOnKeyTypedの違いが判らなくていろいろ実験してみたのですが、矢印キーを押して離す一連の動作でOnKeyPressedは何度も呼ばれることがある一方で、OnKeyReleasedは1回しか呼ばれないため、押す・離すを厳密に区別しないのであればOnKeyReleasedだけを呼べばいいという結論になりました。なお、OnKeyTypedは矢印キーには反応しませんでした。

その他

本筋とは関係ありませんが、アイコンを独自にしてみました。

できなかったこと

連続再生・ランダム再生・リピート再生はちょっと難しそうでした。今回ここまでできたので、時間をかければできるとは思いますが。

最後に、完成したものをGitHubに上げておきます。

github.com

 

簡単なミュージック・プレイヤーを改造してみた

JavaFX Advent Calendar 2017の15日目です。5 日目に公開した「簡単なミュージック・プレイヤー」を改造して、使い勝手を少しだけ改善しました。

プログラムはそれなりの量に達するため、ここではあえて紹介することはせず、GitHub に上げたソースコードをご覧いただきたいと思います。

github.com

実行画面は大幅に変更し、次のような UI になりなした。

f:id:planet-az:20171214015939p:plain

もう少し頑張ると、より本格的なミュージックプレーヤになりそうです。

簡単なミュージックプレーヤーを作ってみた

JavaFX Advent Calendar 2017の5日目です。予定より10日も前に振られてかなり困ったんですけど、何とか初めてのJavaFXプログラムが作れました。

iTunesのフォルダからミュージックファイルを探して、ランダムで1曲を流すというもの。まさかGUIのライブラリに音楽を鳴らすコントロールがついているなんて想像もしていませんでした。

プログラムはクラスファイル1個だけです。

package com.example.az;

import java.io.IOException;
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.Random;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.text.Font;
import javafx.stage.Stage;

/**
 * Az Music Player - とても単純なミュージックプレーヤー
 * 
 * @author Azumi Hirata
 *
 */
public class AzMusicPlayer extends Application {

    @Override
    public void start(Stage stage) throws Exception {

        // iTunesのミュージックファイル(.m4a)のリスト
        List<Path> musicFiles = new ArrayList<>();

        // iTunes Mediaフォルダ
        // Windowsの場合はここ
        Path start = Paths.get(System.getProperty("user.home"), "Music", "iTunes", "iTunes Media");

        // ファイルの探索
        // サブフォルダを含めてミュージックファイルだけ取り出す
        FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                if (file.toString().endsWith(".m4a")) {
                    musicFiles.add(file);
                }
                return FileVisitResult.CONTINUE;
            }

        };

        Files.walkFileTree(start, visitor);

        // ミュージックファイルがなければ終了
        if (musicFiles.isEmpty()) {
            Platform.exit();
        }

        // 再生する曲を決める(ランダム)
        int i = new Random().nextInt(musicFiles.size());
        Path path = musicFiles.get(i);

        // MediaPlayer
        // ミュージックの再生・停止・音量調節など
        Media media = new Media(path.toUri().toString());
        MediaPlayer mediaPlayer = new MediaPlayer(media);
        mediaPlayer.setAutoPlay(true);

        // MediaView
        // MediaPlayerを画面に埋め込む
        MediaView mediaView = new MediaView(mediaPlayer);

        // Image
        // 適当に五線譜と音符の画像を用意する
        Image image = new Image("/publicdomainq-0002180mqg.jpg");

        // ImageView
        // Imageを画面に埋め込む
        ImageView imageView = new ImageView(image);

        // 曲名を取得する
        String name = path.getFileName().toString();

        // ラベル : 曲名
        Label label = new Label("Now playing: " + name);
        label.setFont(new Font(24.0));

        // レイアウト
        VBox vbox = new VBox(imageView, label, mediaView);

        Scene scene = new Scene(vbox);
        stage.setScene(scene);
        stage.setTitle("Az Music Player - " + name);
        stage.show();
    }

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

}

出来上がりの画面はこんな感じです。

f:id:planet-az:20171205144033p:plain

10日後は、これをちょっと改造してみようと思います。

 

ソースコードはこちらです。 

github.com

いままでGitとか使ったことがなかったので、すごく初歩的なところ(SVNと何が違うの?とか)からゆみ id:yumix_h に聞きました。長電話してごめんね。でも前日に振ってくるキミが悪いんだよ。

はじめまして

はじめまして。

Azこと平田あづみです。

今年の夏ごろまで一応SEをやっていましたが、身体を壊して退職し、今は実家に戻って療養中です。SEと言っても、大学は商学部だったし、技術とかあまりないです。

ネット関係も疎かったのですが(会社から帰るといつも0時近くてそんな余裕がなかったです)、最近再開した中学・高校のお友達の平岡由美さんに強要され勧められ、Twitterやブログを始めてみることにしました。

病気療養中の身であまり動けませんが、ネットを通じて皆さんと仲良くできたら嬉しいです。