簡単なミュージックプレーヤーをさらにいじってみた
JavaFX Advent Calendar 2017の18日目です。15日目に改造したミュージックプレーヤーをさらに強化してみました。
強化ポイント1 再生・一時停止・曲送りボタン
再生ボタンを再生・一時停止のトグルボタンに変えて、iTunesと同じような感じに仕上げました。ボタンはCSSでiTunes風のデザインに変えてみました。再生が終わると再生・一時停止ボタンは元に戻ります。
強化ポイント2 マウスとキーボードのイベント
ListViewの曲選択に、マウスとキーボードを使えるようにしました。以前も開始前にマウスで曲選択できるようにはなっていたのですが、今回のは再生中に違う曲を選ぶと、再生中の曲を止めて新しく選んだ曲を再生するようにしました。曲送りボタンを押下したときも同じ動作です。マウスはOnMouseClicked、キーボードはOnKeyReleasedをそれぞれ処理しています。最初はOnKeyReleasedとOnKeyPressedとOnKeyTypedの違いが判らなくていろいろ実験してみたのですが、矢印キーを押して離す一連の動作でOnKeyPressedは何度も呼ばれることがある一方で、OnKeyReleasedは1回しか呼ばれないため、押す・離すを厳密に区別しないのであればOnKeyReleasedだけを呼べばいいという結論になりました。なお、OnKeyTypedは矢印キーには反応しませんでした。
その他
本筋とは関係ありませんが、アイコンを独自にしてみました。
できなかったこと
連続再生・ランダム再生・リピート再生はちょっと難しそうでした。今回ここまでできたので、時間をかければできるとは思いますが。
最後に、完成したものをGitHubに上げておきます。
簡単なミュージック・プレイヤーを改造してみた
JavaFX Advent Calendar 2017の15日目です。5 日目に公開した「簡単なミュージック・プレイヤー」を改造して、使い勝手を少しだけ改善しました。
プログラムはそれなりの量に達するため、ここではあえて紹介することはせず、GitHub に上げたソースコードをご覧いただきたいと思います。
実行画面は大幅に変更し、次のような UI になりなした。
もう少し頑張ると、より本格的なミュージックプレーヤになりそうです。
簡単なミュージックプレーヤーを作ってみた
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); } }
出来上がりの画面はこんな感じです。
10日後は、これをちょっと改造してみようと思います。
ソースコードはこちらです。
いままでGitとか使ったことがなかったので、すごく初歩的なところ(SVNと何が違うの?とか)からゆみ id:yumix_h に聞きました。長電話してごめんね。でも前日に振ってくるキミが悪いんだよ。