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

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

ただいまの
回答率

91.05%

  • Java

    11790questions

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

  • JavaFX

    357questions

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

  • Java ME

    14questions

    Java ME(Java Platform, Micro Edition)はリソースが制限されたデバイス(携帯電話、PDA、テレビなど)用につくられたJavaプラットフォームである。

JavaFX,FXMLアプリケーションでGUIデジタル時計がうまく作動しない(2)

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 130

Miyahala

score 4

前提・実現したいこと

JavaFX,FXMLアプリケーションでGUIデジタル時計をanimation.Timelineを使って作成したい。

発生している問題

起動時に時計の自動スタートの為のTimelineの使い方がわからない。

たぶんTimelineかEventHandlerの使い方の間違いを犯しているのだと思うのですが、どうにも情報が少なくわかりません。

すっかり詰んでしまっています。
プロの方から見ればしょうもないエラーなのでしょうが また質問させていただきます。申し訳ないのですがどのように修正すれば良いのでしょうか?

コンパイル時のエラーメッセージ

\FXMLDocumentController.java:58: エラー: <identifier>がありません
label.setText(txt);
D:\一括\新しいフォルダー\NetBeansProjects\Tokei3\src\tokei3\FXMLDocumentController.java:58: エラー: <identifier>がありません
label.setText(txt);
エラー2個

該当のソースコード

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package tokei3;

import java.net.URL;
import java.time.LocalTime;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.animation.Timeline;
import javafx.animation.KeyFrame;
import javafx.util.Duration;
import javafx.event.*;
/**
 *
 * @author test
 */
public class FXMLDocumentController implements Initializable {

    @FXML
    Label label;

    @FXML
    private void handleButtonAction(ActionEvent event) {
    //何も書いていない。
    }   
      @Override
      public void initialize(URL url, ResourceBundle rb) {

            //Timelineインスタンス作成、同時にKeyFrameインスタンスも作成し、1000millisごとのアニメーション動作を指定
            Timeline timeline = new Timeline(new KeyFrame(Duration.millis(1000)));**(後日メモ!ここに主要な問題がありました!)**

            //EventHandler<actionevent>(){}の{}内に処理したい内容を書く
            new EventHandler<actionevent>(){

                   //現在時刻を取得
                   LocalTime now=LocalTime.now();
                   //ラベル表示させる値をLocalTimeから取得
                   String txt=String.format("%02d:%02d:%02d",
                                      now.getHour(),
                                      now.getMinute(),
                                      now.getSecond());
                   //ラベルに取得した値を表示
                   label.setText(txt);
             };//ここまでが{}の中に書いた処理したい内容  

     //アニメーションの作動期間は無限を指定
     timeline.setCycleCount(Timeline.INDEFINITE);
     //アニメーション開始
     timeline.play();
     //動きません、なんでだろう     
     }    
}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package tokei3;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author test
 */
public class Tokei3 extends Application {

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


        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }  
}
<?xml version="1.0" encoding="UTF-8"?>

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

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="tokei3.FXMLDocumentController">
    <children>
        <Button fx:id="button" layoutX="126" layoutY="90" onAction="#handleButtonAction" text="Click Me!" />
        <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69">
         <font>
            <Font size="28.0" />
         </font></Label>
    </children>
</AnchorPane>

#

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KSwordOfHaste

    2018/01/11 12:00

    コード用のマークダウンを用いておられるのはよいのですが肝心の字下げがまったくされていません。しかるべき字下げをしたソースを張り付けることを強くお勧めします。

    キャンセル

回答 1

checkベストアンサー

+2

まず文法の間違いを訂正してください。

おそらく質問者さんが用いようとしているのは次のKeyFrameのコンストラクターなのだと思います。

public KeyFrame(Duration time,
                EventHandler<ActionEvent> onFinished,
                KeyValue... values)

意味的な記述ミス1

構文的に第一引数のDurationしか指定できておらず、第二引数以降(EventHandler<ActionEvent>)が別の文になってしまってますよ?

文法エラー2

new EventHandler<actionevent>() ...
のように記述しておられますが、actioneventというクラスはありません。ActionEventです。綴り間違いがないように注意(※)してくださいね。

文法エラー3

EventHandler<ActionEvent>のインスタンスを無名クラスによる定義する文法が間違っています。以下のように書いてください。(ネストの状態が分かり易いようにあえて改行して書いてみました)

Timeline timeline =
  new Timeline(
    new KeyFrame(
      Duration.millis(1000),
      new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
          //現在時刻を取得
          LocalTime now = LocalTime.now();
          //ラベル表示させる値をLocalTimeから取得
          String txt = String.format("%02d:%02d:%02d",
                                     now.getHour(),
                                     now.getMinute(),
                                     now.getSecond());
          //ラベルに取得した値を表示
          label.setText(txt);
        }
      }
    )
  );

なお、オーバーライドすべきメソッドが一つしかないような抽象クラスやインターフェースの無名クラスを用いたインスタンス生成は今や古い書き方とも言えます。JavaFXを学習するならjava8以降が前提と仮定できると思いますので、ラムダ式を用いることをお勧めします。(追記:スミマセン。抽象クラスにはラムダ式は使えませんでした。)
(ただし、無名クラスの意味について曖昧ならまずは無名クラスをしっかりマスターした方がよいとは思います。それからラムダ式を覚えるとよいでしょう。この二つは厳密には違うものですけど、使う目的はほぼ同様なのです。)

Timeline timeline =
  new Timeline(
    new KeyFrame(
      Duration.millis(1000),
      event -> {
        //現在時刻を取得
        LocalTime now = LocalTime.now();
        //ラベル表示させる値をLocalTimeから取得
        String txt = String.format("%02d:%02d:%02d",
                                   now.getHour(),
                                   now.getMinute(),
                                   now.getSecond());
        //ラベルに取得した値を表示
        label.setText(txt);
      }
    )
  );

※: 綴り間違いなどのミスについて

ところで・・・ある程度まともなアプリケーションを作ろうとする場合、個人的にはIDEを用いるのがほとんど必須であると思っています。EventHandler<actionevent>...などのようなミスはIDEのエディター上で「actioneventなんてクラスはないぞ・・・」とタイプするそばから即座に警告してくれるからです。

自分も昔はなんの言語サポートもないテキストエディターでJavaのコードを書いたこともありましたが、IDEを用いている今はこうした文法エラーをコンパイルしては直すといった問題にわずらわされることはなくなりました。そもそもコンパイルそのものもタイプするそばから自動的にIDEがやってくれますので意識することもありません。

こういう理由で殆どのJavaプログラマーはIDEを使っていると思います。タイプし終わる前に全ての文法エラーはなくなっており、またコンパイルも裏でIDEがやってくれるのが便利すぎて以前の状態には戻れません。javaに限らず多くのコンパイラー言語でそのような開発環境を用いるのは当たり前に近くなっているのではないでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/16 20:01

    動きました素晴らしいです。
    数日間考えても答えがどうしてもわかりませんでしたが、僅か数分で複数の問題点が識別された上で丁寧に回答してくだり、ありがたいのと同時に驚いています。

    すみませんあと一つ理解を深めるために質問させてください。
    文法エラー3の件なのですが、インスタンス作成後、無名クラス?というものを利用する手順を取っておられますが、これはEventHandler<ActionEvent>のインスタンスをオーバーライドして書き換える事が必要な為に無名クラスと言うものを使用する事になったということなのでしょうか?

    キャンセル

  • 2018/01/17 22:15 編集

    > これはEventHandler<ActionEvent>のインスタンスをオーバーライドして書き換える事が必要

    概ねよいですが、厳密に言えば「書き換える」のではなく宣言されていて実装されていないメソッドを「実装する」です。そもそもEventHandlerはinterfaceなのでactionPerfomedメソッドのインターフェース(引数の個数と型とメソッドの型)の宣言しかなく肝心の実装(中身)がないので自分で定義する必要があります。メソッドを定義するにはクラスの定義が必要ですが一々名前をつけるのがめんどくさいので名前をつけずにインスタンス生成と同時に名前のないクラスも定義するというのが無名クラスの意味です。

    多分中途半端に説明するよりは「java 無名クラス」で検索するなどして、それが何かを説明した解説をお読みになった方が有意義だと思います。

    キャンセル

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

  • ただいまの回答率 91.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    11790questions

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

  • JavaFX

    357questions

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

  • Java ME

    14questions

    Java ME(Java Platform, Micro Edition)はリソースが制限されたデバイス(携帯電話、PDA、テレビなど)用につくられたJavaプラットフォームである。