質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1470閲覧

Java 進行タイム出力

ryohasegawa

総合スコア437

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/06/24 03:49

動画再生コードをネットで探して、コードを勉強しているんですが、分からない書き方をみつけて、検索してみたんですが、わからなかったので、質問します。

このコードなんですが、67行目から3行で現在の進行開始秒を出力しているコードだと思うのですが、まずcurrentTimeProperty()で何をしていて、addListenerで何を追加しているのかがわからず、(ov) ->この書き方もわかりません。
唯一わかるのは、System.out.printlnコンソール出力をしているという事ぐらいです。
出力している.getCurrentTime()でどういうタイムを取得しているのですか?
教えてください。

java

1// 動作確認用の出力を設定 2 Play.currentTimeProperty().addListener( (ov) -> System.out.println( Play.getCurrentTime() ) ); 3 Play.statusProperty().addListener( (ov) -> System.out.println( Play.getStatus() ) );

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • currentTimeProperty()

JavaFXのT型のxxxという名前のプロパティーはgetXxx, setXxx, xxxPropertyという3つのアクセッサーで一つのプロパティーを表すようになっています。この3つについては以下のような解説をご覧ください。

https://docs.oracle.com/javase/jp/8/javafx/properties-binding-tutorial/binding.htm

xxxPropertyは当該プロパティーに対するイベントハンドラーの登録やデータのバインディングなどをするために使います。本件ではイベントハンドラーの登録をするために使っています。

  • addListner

JavaFXのプロパティーは「監視可能=Observable」なものでして、「値が変わったら何かをする」ということをリスナー登録により行えるようになっています。addListnerはハンドラーを特定のプロパティーへ登録するためのメソッドです。

  • (ov) -> ...

これはJava8からサポートされたラムダ記法と呼ばれるものです。「java8 lamda 解説」でいろいろな解説が出てくるのでそれを調べてみてください。「難しくかいてあるサイトも」「平易に書いてあるサイト」も色々でてきます。

ラムダ記法が意味することを簡単に言えば「Java7まで以下のように書かなければならなかった無名クラスの定義のショートハンド」だと思えばよいと思います。

java

1// java7まで 2 3player.currentTimeProperty().addListener(new InvalidationListener() { 4 @Override 5 public void invalidated(Observable ov) { 6 System.out.println(player.getCurrentTime()); 7 } 8}); 9 10// java8 11 12player.currentTimeProperty().addListener(ov -> System.out.println(player.getCurrentTime()));

結局上のコードは「MediaPlayerインスタンスのcurrentTimeプロパティーの値が変化するごとに、その値を印字する処理を登録する」という意味になります。


補足:
JavaFXを扱っているとaddListenerで複数の種類のイベントハンドラーを扱えることがわかってくると思います。本件のReadOnlyObjectPropertyの例ではInvalidationListenerとChangeListenerの2種類が登録できます。しかしlambda記法を使うとすぐにはどちらかがわからないかも知れません。しかしlambda記法とこの2つのインターフェースの定義をよく調べてみると2つのインターフェースのメソッドの引数の個数が違うために本件のコードがInvalidationListenerに決まるということが分かってくると思います。

余談:
PlayなんてクラスはJavaFXになかったはず・・・と思ってご質問にあるサイトを見てみましたがなんということはない、MediaPlayerのインスタンスを表すローカル変数を大文字始まりで綴っているだけなのですね・・・・できればJavaのコードではローカル変数は小文字から綴ってもらった方がビックリせずに済みますし、Playじゃなくてplayerの方がより適切ではないかと思います。


追記:下記回答コメントに対しこちらへ回答します。

addListner のハンドラーを特定のプロパティーへ登録

という理解が難しいのですが、要するに、player.currentTimeProperty() の値が変わったら、参照して、(ov) -> System.out.println( Play.getCurrentTime() ) を実行するという事ですか?

次のように分解して考えてみた方が理解しやすいかも知れません。

java

1ReadOnlyObjectProperty<Duration> property = player.currentTimeProperty(); //(1) 2property.addListener(ov -> { A; }); //(2)

(1)ではcurrentTimeのプロパティーを表すプロパティーインスタンスが求まります。このインスタンスにはいろいろな機能があり、property.get()とすると現在のプロパティーの値が得られますし、property.set(...)とするとプロパティーの値を変更することができます。またproperty.addListnerを用いるとイベントのハンドラーを登録することができます。
そのプロパティーインスタンスに対して、「あなたの値が変化したときに、Aを自動的に呼び出すようにしてくださいね!お願いします!」と依頼するのが(2)です。

投稿2017/06/24 05:43

編集2017/06/24 06:51
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryohasegawa

2017/06/24 06:17

currentTimeProperty なんですが、今回の場合は、PlayのcurrentTimeのプロパティを呼び出すという意味ですか?
KSwordOfHaste

2017/06/24 06:24

そう思っていいと思います。どちらかといえば、呼び出すというより「プロパティーオブジェクトを参照する」に近いイメージだと思いますが。
ryohasegawa

2017/06/24 06:30

参照ですね。 一つ解決できました。
ryohasegawa

2017/06/24 06:36

addListner のハンドラーを特定のプロパティーへ登録 という理解が難しいのですが、要するに、player.currentTimeProperty() の値が変わったら、参照して、(ov) -> System.out.println( Play.getCurrentTime() ) を実行するという事ですか?
KSwordOfHaste

2017/06/24 07:04

回答欄の方へ追記しました。
ryohasegawa

2017/06/24 07:11

はい。ありがとうございます。
ryohasegawa

2017/06/24 07:15

Play.currentTimeProperty() で求めた値が変化したら、 System.out.println( Play.getCurrentTime() ) を実行せよ という意味ですね?
KSwordOfHaste

2017/06/24 08:43

そうですね。回答したとおりです。
ryohasegawa

2017/06/24 09:23

ありがとうございます。 大分理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問