Labelが表示できません!
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,485

退会済みユーザー
前提・実現したいこと
JavaFXでスプラッシュウィンドウを作ろうと思っています.
しかし,実行してみたところ,Labelが表示されません.
発生している問題・エラーメッセージ
"Welcome to DispFlash!!"が表示されません.
該当のソースコード
SplashWndクラスです.
class SplashWnd extends Stage {
public SplashWnd(Window wnd){
this.initStyle(StageStyle.UNIFIED);
this.initOwner(wnd);
this.initModality(Modality.APPLICATION_MODAL);
this.setResizable(false);
this.setWidth(600);
this.setHeight(400);
this.setAlwaysOnTop(true);
Label lbl = new Label();
lbl.setPrefWidth(460);
lbl.setFont(new Font(24));
lbl.setText("Welcome to DispFlash!!");
VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(lbl);
this.setScene(new Scene(root));
}
}
DispFlashクラスです.
public class DispFlash extends Application {
@Override
public void start(Stage stage) throws Exception {
Stage splash = new SplashWnd(stage);
splash.show();
Thread.sleep(500);
stage.setTitle("DispFlash");
stage.setWidth(240);
stage.setHeight(120);
Label lblMsg = new Label("Hello, JavaFX");
lblMsg.setFont(new Font(12));
Button btnOk = new Button("OK");
btnOk.setPrefWidth(80);
btnOk.setOnAction(event -> stage.close());
VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10,10,10,10));
root.setSpacing(20);
root.getChildren().addAll(lblMsg,btnOk);
stage.setScene(new Scene(root));
stage.show();
Thread.sleep(2500);
splash.hide();
splash=null;
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
ローカルで試しました。
DispFlas.javaには以下を追加しました。
public static void main(String[] args) {
launch(args);
}
その後、DispFlas.javaを実行したら動きました。
以下に丸ごと貼り付けましたのでimport文を中心に確認してみてください。
package test45804;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.Window;
public class SplashWnd extends Stage {
public SplashWnd(Window wnd){
this.initStyle(StageStyle.UNIFIED);
this.initOwner(wnd);
this.initModality(Modality.APPLICATION_MODAL);
this.setResizable(false);
this.setWidth(600);
this.setHeight(400);
this.setAlwaysOnTop(true);
Label lbl = new Label();
lbl.setPrefWidth(460);
lbl.setFont(new Font(24));
lbl.setText("Welcome to DispFlash!!");
VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(lbl);
this.setScene(new Scene(root));
}
}
package test45804;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class DispFlash extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Stage splash = new SplashWnd(stage);
splash.show();
Thread.sleep(500);
stage.setTitle("DispFlash");
stage.setWidth(240);
stage.setHeight(120);
Label lblMsg = new Label("Hello, JavaFX");
lblMsg.setFont(new Font(12));
Button btnOk = new Button("OK");
btnOk.setPrefWidth(80);
btnOk.setOnAction(event -> stage.close());
VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10,10,10,10));
root.setSpacing(20);
root.getChildren().addAll(lblMsg,btnOk);
stage.setScene(new Scene(root));
stage.show();
Thread.sleep(2500);
splash.hide();
splash=null;
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
start()
メソッドを実行しているのは、JavaFX Application Thread
というスレッドですが、このスレッドは描画やイベント処理などを担当するスレッドなので、ユーザーがThread.sleep()
などで任意のスリープを行うと、それらの処理が妨げられてしまうのでやってはいけません。
これはJavaFXに限ったことではなく、(少なくとも)JavaのGUIでは同じです。
ではどうするかと言うと、アニメーションの専用クラスを使えば良いです。
javafx.animation
パッケージにはアニメーションのためのクラスが多数用意されています。
ここでは、Timeline
を使った例を紹介します。
// 前半省略
stage.setScene(new Scene(root));
stage.show();
splash.requestFocus();
// Thread.sleep(2500);
// splash.hide();
// splash=null;
Timeline timer = new Timeline(new KeyFrame(Duration.millis(1500), new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event) {
splash.hide();
// stage.show();
}
}));
timer.setCycleCount(1);
timer.play();
ただ、この質問の問題はこれだけではなくて、スプラッシュウィンドウがメインウィンドウをshow()
したときにフォーカスを失うのも問題のような気がします。requestFocus()
でフォーカスさせればちゃんと表示されると思うんですけど、その場合は少しちらつきが発生してしまいます。
おすすめは、splash.hide()
したあとにstage.show()
してしまうことです。
ついでに。
splash=null;
は、この場合はあまり意味が無いですし、Javaでは推奨されない書き方なので消した方が良いです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる