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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java ME

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

JavaFX

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

Java

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

Q&A

解決済

1回答

790閲覧

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

Miyahala

総合スコア19

Java ME

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

JavaFX

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

Java

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

0グッド

1クリップ

投稿2018/01/11 02:07

編集2018/01/23 13:42

####前提・実現したいこと
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個

###該当のソースコード

java

1/* 2 * To change this license header, choose License Headers in Project Properties. 3 * To change this template file, choose Tools | Templates 4 * and open the template in the editor. 5 */ 6package tokei3; 7 8import java.net.URL; 9import java.time.LocalTime; 10import java.util.ResourceBundle; 11import javafx.event.ActionEvent; 12import javafx.fxml.FXML; 13import javafx.fxml.Initializable; 14import javafx.scene.control.Label; 15import javafx.animation.Timeline; 16import javafx.animation.KeyFrame; 17import javafx.util.Duration; 18import javafx.event.*; 19/** 20 * 21 * @author test 22 */ 23public class FXMLDocumentController implements Initializable { 24 25 @FXML 26 Label label; 27 28 @FXML 29 private void handleButtonAction(ActionEvent event) { 30 //何も書いていない。 31 } 32 @Override 33 public void initialize(URL url, ResourceBundle rb) { 34 35 //Timelineインスタンス作成、同時にKeyFrameインスタンスも作成し、1000millisごとのアニメーション動作を指定 36 Timeline timeline = new Timeline(new KeyFrame(Duration.millis(1000)));**(後日メモ!ここに主要な問題がありました!)** 37 38 //EventHandler<actionevent>(){}の{}内に処理したい内容を書く 39 new EventHandler<actionevent>(){ 40 41 //現在時刻を取得 42 LocalTime now=LocalTime.now(); 43 //ラベル表示させる値をLocalTimeから取得 44 String txt=String.format("%02d:%02d:%02d", 45 now.getHour(), 46 now.getMinute(), 47 now.getSecond()); 48 //ラベルに取得した値を表示 49 label.setText(txt); 50 };//ここまでが{}の中に書いた処理したい内容 51 52 //アニメーションの作動期間は無限を指定 53 timeline.setCycleCount(Timeline.INDEFINITE); 54 //アニメーション開始 55 timeline.play(); 56 //動きません、なんでだろう 57 } 58}

java

1/* 2 * To change this license header, choose License Headers in Project Properties. 3 * To change this template file, choose Tools | Templates 4 * and open the template in the editor. 5 */ 6package tokei3; 7 8import javafx.application.Application; 9import javafx.fxml.FXMLLoader; 10import javafx.scene.Parent; 11import javafx.scene.Scene; 12import javafx.stage.Stage; 13 14/** 15 * 16 * @author test 17 */ 18public class Tokei3 extends Application { 19 20 @Override 21 public void start(Stage stage) throws Exception { 22 23 24 Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 25 26 Scene scene = new Scene(root); 27 28 stage.setScene(scene); 29 stage.show(); 30 } 31 32 /** 33 * @param args the command line arguments 34 */ 35 public static void main(String[] args) { 36 launch(args); 37 } 38} 39

xml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.text.*?> 4<?import java.lang.*?> 5<?import java.util.*?> 6<?import javafx.scene.*?> 7<?import javafx.scene.control.*?> 8<?import javafx.scene.layout.*?> 9 10<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="tokei3.FXMLDocumentController"> 11 <children> 12 <Button fx:id="button" layoutX="126" layoutY="90" onAction="#handleButtonAction" text="Click Me!" /> 13 <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69"> 14 <font> 15 <Font size="28.0" /> 16 </font></Label> 17 </children> 18</AnchorPane>

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

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

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

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

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

KSwordOfHaste

2018/01/11 03:00

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

回答1

0

ベストアンサー

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

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

java

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

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

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

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

java

1Timeline timeline = 2 new Timeline( 3 new KeyFrame( 4 Duration.millis(1000), 5 new EventHandler<ActionEvent>() { 6 @Override 7 public void handle(ActionEvent event) { 8 //現在時刻を取得 9 LocalTime now = LocalTime.now(); 10 //ラベル表示させる値をLocalTimeから取得 11 String txt = String.format("%02d:%02d:%02d", 12 now.getHour(), 13 now.getMinute(), 14 now.getSecond()); 15 //ラベルに取得した値を表示 16 label.setText(txt); 17 } 18 } 19 ) 20 );

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

java

1Timeline timeline = 2 new Timeline( 3 new KeyFrame( 4 Duration.millis(1000), 5 event -> { 6 //現在時刻を取得 7 LocalTime now = LocalTime.now(); 8 //ラベル表示させる値をLocalTimeから取得 9 String txt = String.format("%02d:%02d:%02d", 10 now.getHour(), 11 now.getMinute(), 12 now.getSecond()); 13 //ラベルに取得した値を表示 14 label.setText(txt); 15 } 16 ) 17 );

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

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

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

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

投稿2018/01/11 03:30

編集2018/01/16 12:04
KSwordOfHaste

総合スコア18392

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

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

Miyahala

2018/01/16 11:01

動きました素晴らしいです。 数日間考えても答えがどうしてもわかりませんでしたが、僅か数分で複数の問題点が識別された上で丁寧に回答してくだり、ありがたいのと同時に驚いています。 すみませんあと一つ理解を深めるために質問させてください。 文法エラー3の件なのですが、インスタンス作成後、無名クラス?というものを利用する手順を取っておられますが、これはEventHandler<ActionEvent>のインスタンスをオーバーライドして書き換える事が必要な為に無名クラスと言うものを使用する事になったということなのでしょうか?
KSwordOfHaste

2018/01/17 13:15 編集

> これはEventHandler<ActionEvent>のインスタンスをオーバーライドして書き換える事が必要 概ねよいですが、厳密に言えば「書き換える」のではなく宣言されていて実装されていないメソッドを「実装する」です。そもそもEventHandlerはinterfaceなのでactionPerfomedメソッドのインターフェース(引数の個数と型とメソッドの型)の宣言しかなく肝心の実装(中身)がないので自分で定義する必要があります。メソッドを定義するにはクラスの定義が必要ですが一々名前をつけるのがめんどくさいので名前をつけずにインスタンス生成と同時に名前のないクラスも定義するというのが無名クラスの意味です。 多分中途半端に説明するよりは「java 無名クラス」で検索するなどして、それが何かを説明した解説をお読みになった方が有意義だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問