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

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

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

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

Java

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

Q&A

解決済

2回答

2195閲覧

Labelが表示できません!

退会済みユーザー

退会済みユーザー

総合スコア0

JavaFX

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

Java

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

0グッド

0クリップ

投稿2016/08/27 14:54

###前提・実現したいこと
JavaFXでスプラッシュウィンドウを作ろうと思っています.
しかし,実行してみたところ,Labelが表示されません.

###発生している問題・エラーメッセージ

生成されるスプラッシュウィンドウは以下のような感じです.
スプラッシュウィンドウ

"Welcome to DispFlash!!"が表示されません.

###該当のソースコード
SplashWndクラスです.

Java

1class SplashWnd extends Stage { 2 3 public SplashWnd(Window wnd){ 4 this.initStyle(StageStyle.UNIFIED); 5 this.initOwner(wnd); 6 this.initModality(Modality.APPLICATION_MODAL); 7 this.setResizable(false); 8 this.setWidth(600); 9 this.setHeight(400); 10 this.setAlwaysOnTop(true); 11 12 Label lbl = new Label(); 13 lbl.setPrefWidth(460); 14 lbl.setFont(new Font(24)); 15 lbl.setText("Welcome to DispFlash!!"); 16 17 VBox root = new VBox(); 18 root.setAlignment(Pos.CENTER); 19 root.getChildren().addAll(lbl); 20 21 this.setScene(new Scene(root)); 22 } 23}

DispFlashクラスです.

Java

1public class DispFlash extends Application { 2 3 @Override 4 public void start(Stage stage) throws Exception { 5 6 Stage splash = new SplashWnd(stage); 7 splash.show(); 8 Thread.sleep(500); 9 10 stage.setTitle("DispFlash"); 11 stage.setWidth(240); 12 stage.setHeight(120); 13 14 Label lblMsg = new Label("Hello, JavaFX"); 15 lblMsg.setFont(new Font(12)); 16 17 Button btnOk = new Button("OK"); 18 btnOk.setPrefWidth(80); 19 btnOk.setOnAction(event -> stage.close()); 20 21 VBox root = new VBox(); 22 root.setAlignment(Pos.CENTER); 23 root.setPadding(new Insets(10,10,10,10)); 24 root.setSpacing(20); 25 root.getChildren().addAll(lblMsg,btnOk); 26 27 stage.setScene(new Scene(root)); 28 stage.show(); 29 30 Thread.sleep(2500); 31 splash.hide(); 32 splash=null; 33 } 34}

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

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

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

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

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

guest

回答2

0

ベストアンサー

ローカルで試しました。

イメージ説明

イメージ説明

DispFlas.javaには以下を追加しました。

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

その後、DispFlas.javaを実行したら動きました。

以下に丸ごと貼り付けましたのでimport文を中心に確認してみてください。

SplashWnd.java

1package test45804; 2 3import javafx.geometry.Pos; 4import javafx.scene.Scene; 5import javafx.scene.control.Label; 6import javafx.scene.layout.VBox; 7import javafx.scene.text.Font; 8import javafx.stage.Modality; 9import javafx.stage.Stage; 10import javafx.stage.StageStyle; 11import javafx.stage.Window; 12 13public class SplashWnd extends Stage { 14 15 public SplashWnd(Window wnd){ 16 this.initStyle(StageStyle.UNIFIED); 17 this.initOwner(wnd); 18 this.initModality(Modality.APPLICATION_MODAL); 19 this.setResizable(false); 20 this.setWidth(600); 21 this.setHeight(400); 22 this.setAlwaysOnTop(true); 23 24 Label lbl = new Label(); 25 lbl.setPrefWidth(460); 26 lbl.setFont(new Font(24)); 27 lbl.setText("Welcome to DispFlash!!"); 28 29 VBox root = new VBox(); 30 root.setAlignment(Pos.CENTER); 31 root.getChildren().addAll(lbl); 32 33 this.setScene(new Scene(root)); 34 } 35}

DispFlash

1package test45804; 2 3import javafx.application.Application; 4import javafx.geometry.Insets; 5import javafx.geometry.Pos; 6import javafx.scene.Scene; 7import javafx.scene.control.Button; 8import javafx.scene.control.Label; 9import javafx.scene.layout.VBox; 10import javafx.scene.text.Font; 11import javafx.stage.Stage; 12 13public class DispFlash extends Application { 14 15 public static void main(String[] args) { 16 launch(args); 17 } 18 19 @Override 20 public void start(Stage stage) throws Exception { 21 22 Stage splash = new SplashWnd(stage); 23 splash.show(); 24 Thread.sleep(500); 25 26 stage.setTitle("DispFlash"); 27 stage.setWidth(240); 28 stage.setHeight(120); 29 30 Label lblMsg = new Label("Hello, JavaFX"); 31 lblMsg.setFont(new Font(12)); 32 33 Button btnOk = new Button("OK"); 34 btnOk.setPrefWidth(80); 35 btnOk.setOnAction(event -> stage.close()); 36 37 VBox root = new VBox(); 38 root.setAlignment(Pos.CENTER); 39 root.setPadding(new Insets(10,10,10,10)); 40 root.setSpacing(20); 41 root.getChildren().addAll(lblMsg,btnOk); 42 43 stage.setScene(new Scene(root)); 44 stage.show(); 45 46 Thread.sleep(2500); 47 splash.hide(); 48 splash=null; 49 } 50}

投稿2016/08/27 15:45

java-beginner

総合スコア452

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

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

0

start()メソッドを実行しているのは、JavaFX Application Threadというスレッドですが、このスレッドは描画やイベント処理などを担当するスレッドなので、ユーザーがThread.sleep()などで任意のスリープを行うと、それらの処理が妨げられてしまうのでやってはいけません。
これはJavaFXに限ったことではなく、(少なくとも)JavaのGUIでは同じです。

ではどうするかと言うと、アニメーションの専用クラスを使えば良いです。
javafx.animationパッケージにはアニメーションのためのクラスが多数用意されています。

ここでは、Timelineを使った例を紹介します。

lang

1// 前半省略 2 3stage.setScene(new Scene(root)); 4stage.show(); 5splash.requestFocus(); 6 7// Thread.sleep(2500); 8// splash.hide(); 9// splash=null; 10 11Timeline timer = new Timeline(new KeyFrame(Duration.millis(1500), new EventHandler<ActionEvent>(){ 12 @Override 13 public void handle(ActionEvent event) { 14 splash.hide(); 15 // stage.show(); 16 } 17})); 18timer.setCycleCount(1); 19timer.play();

ただ、この質問の問題はこれだけではなくて、スプラッシュウィンドウがメインウィンドウをshow()したときにフォーカスを失うのも問題のような気がします。requestFocus()でフォーカスさせればちゃんと表示されると思うんですけど、その場合は少しちらつきが発生してしまいます。
おすすめは、splash.hide()したあとにstage.show()してしまうことです。

ついでに。
splash=null;は、この場合はあまり意味が無いですし、Javaでは推奨されない書き方なので消した方が良いです。

投稿2016/08/27 15:52

argius

総合スコア9388

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問