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

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

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

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

Java

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

Q&A

1回答

4063閲覧

javaFXにて、Applicationを継承したクラスではない他のクラスから実行したい

nuiri1343

総合スコア54

JavaFX

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

Java

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

0グッド

0クリップ

投稿2017/11/30 09:27

###前提・実現したいこと
javaFXにて、GUIプログラムをつくりたいのですが、
他の普通のコントロールクラスから、こういう画面を表示してくれという指示が来たら
それを受けたApplicationを継承したクラスが表示する
という流れのプログラムを作りたいです。

例えば、HelloWorldいうLabelを表示するプログラムを、メインクラスが表示しろと指示したら表示するようにしたいです。
どうすればいいのでしょうか?

###該当のソースコード
これがGUI表示クラスです。

java

1import javafx.application.Application; 2import javafx.stage.Stage; 3import javafx.scene.Scene; 4import javafx.scene.control.*; 5import javafx.scene.text.*; 6 7 8public class HelloWorld extends Application{ 9 10 private Stage stage; 11 12 @Override 13 public void start(Stage pStage){ 14 stage = newStage; 15 stage.setTitle("HelloWorld!!"); 16 stage.setWidth(540); 17 stage.setHeight(220); 18 19 Label label = new Label("Hello, JavaFX!!"); 20 label.setFont(new Font(80)); 21 stage.setScene(new Scene(label)); 22 stage.show(); 23 } 24}

これがメインクラスです。
コマンドプロンプトでは、java Mainと実行したいです。

java

1public class Main{ 2 3 public static void main(String[] args){ 4 5 String s = new java.util.Scanner(System.in).nextLine(); 6 7 if(s.equals("a")){ 8 //helloworldという画面を表示する 9 //ここに上記のGUIクラスを呼び出すメソッド?とかを書けばいいのでしょうか・・・? 10 }else{ 11 System.out.println("HelloWorld!!"); 12 } 13 } 14}

###補足情報(言語/FW/ツール等のバージョンなど)
アドバイスでもかまいませんのでよろしくお願いいたします。

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

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

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

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

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

KSwordOfHaste

2017/11/30 09:39

アプリケーションのライフサイクルをもう少し詳しくきかせてほしいです。メインクラスが一旦JavaFXアプリケーションを起動したら、メインクラスはそれ以上なにもせずにあとはJavaFXに全ての制御をまかせてよいのですか?
nuiri1343

2017/11/30 10:10

ありがとうございます。いえ、例えば、ハローワールドではなくボタンを出現させて、選んでもらい、その後の処理はメインクラスで行ったり、その後の計算結果を画面で出したりなど。あくまでもメインなのはメインクラスでGUIクラスは画面表示に専念する感じで行きたいです。
KSwordOfHaste

2017/11/30 10:14

そうでしたか。そのようなことをやったことがないので大丈夫かどうか自信ないです。ちなみに「ボタンを表示」が必ず行われるならモジュールの階層を逆転して設計した方が自然と思います。つまりあくまでJavaFXをメインに据えた方が設計しやすいと思います。
nuiri1343

2017/11/30 11:15

メインクラスをメインに据えることはできないのでしょうか?
KSwordOfHaste

2017/11/30 11:19

GUIを出した後に何をしたいかによると思います。ユーザーとのインタラクションは画面が出ているのですからGUI側で行うのが自然に思えます。であればmainスレッドではUI以外のことをするわけですが、何をするとお考えでしょうか?そのあたりをもう少し具体的に質問に書いていただけるとよいと思います。プログラムの流れを簡単に表現する感じです。
guest

回答1

0

質問にコメントした点が若干気になりますが、とりあえずわかる範囲で回答いたします。以下のように書けますが条件があります。

java

1import javafx.application.Application; 2 3public class Main { 4 public static void main(String[] args) { 5 ... 6 Application.launch(WebViewScrollTest.class, args); //(A) 7 } 8}

(1) (A)を起動した後
基本的に起動元ではそれ以上なにもしない方が無難と思います。Java mainスレッドは速やかに完了するということになります。

(2) (A)ははこのアプリケーション実行中1度しか呼べません。
といっても(1)から必然的にそうなりますが。


追記:質問コメントを補足します。
MainクラスでGUIを表示後にも何かをするとすれば下記のようなスレッド構成になります。
このスレッド構成だとmainスレッドでどういうきっかけで何をするようなプログラムをお望みなのかが自分には見えなかったのです。

イメージ説明

投稿2017/11/30 10:10

編集2017/11/30 11:40
KSwordOfHaste

総合スコア18394

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

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

nuiri1343

2017/12/01 01:28

わざわざ図まで作っていただきありがとうございます 自分がもともと作りたかったプログラムは、 例えば、GUI画面表示で500というボタンと1000というボタンを表示し、 500というボタンが押されたらデータベースの値を500増やすといったような処理で、 もちろん、本当はもっと複雑な計算とかもするのですが、 その計算やら、データベース接続やらをJavaFXファイルに記述したくないんです。 あくまでもapplicationを継承したクラスは、画面表示の部分で そこで受け取った値を使って計算したり、何かするのはメインクラスの方で行いたいのです。 そして、データベースの値を500増やしたら、次はいくつ減らすかという画面を表示してほしいというのをメインクラスからJavaFXクラスへと指示して、画面が変わるという具合にです。 また、実行時も、java Mainで行いたいのですが、ここは優先度で言えば2番目です。 よろしくお願いいたします。
KSwordOfHaste

2017/12/01 01:42

なるほど。いってみればMainの方の機能はGUIを必ずしも前提にしない閉じた設計にし、GUI部分はplug-in的(といったらいいのかな)に組み合わせることができるみたいな設計をしたいというお考えのように見えました。
KSwordOfHaste

2017/12/01 01:57 編集

> その計算やら、データベース接続やらをJavaFXファイルに記述したくないんです。 これは「JavaFXファイルに記述したくない」という表現より「GUIを意識したコードの中にアプリケーションロジックを混入させたくない」ということのように見えました。それはMVCとして設計すれば問題ないように感じます。アプリケーション論理はGUI的な要素を一切排除した(CUIアプリからでも使えるような)モデルクラス=ビジネスロジックとして設計すればよいような気がします。View ControllerはどうしてもGUIを意識した設計になりますが、Model自体はGUIに依存しない設計にできると思います。
nuiri1343

2017/12/01 02:11

自分の言いたいことが伝わったようで嬉しいです。 話をもとに戻しまして、自分はまだ始めたばかりの初心者ですので、できれば詳しく教えていただけないでしょうか 結局、どのように書いていけばいいのでしょうか……
KSwordOfHaste

2017/12/01 02:21

MVCは「こうかけばいい」といった単純な話でないような気がします。それを理解する大前提としてオブジェクト指向におけるデザインパターンの基本は押さえておいた方がよさそうです。そうした前提知識なしにいきなりMVCはこう書けばよいといった説明をするのは難しいです。前提とした概念が伝わらないと基本概念から説明しなければならないからです。クラス設計やデザインパターンについては学ばれてますでしょうか?もし学んでおられるなら例えば以下のような提案ができる気がします。 「アプリケーションロジックをGUIを排除したインターフェースで設計」「JavaFXのControllerへはそのインターフェースを実装したモデルを保持させ、必要な計算をするさいにdelegateすればよい」など。
nuiri1343

2017/12/01 03:16

すいません。全くわかりません MVCというのもわからないですが。 普通の(と言っていいのかわかりませんが)GUIプログラムは、 GUIクラス視点で処理が進むと思います。UIから値を受け取ったから、コントロールクラスの計算するメソッドを呼び出して… みたいな形で。 でも逆に、コントロールクラス視点でやってみたいということです。 アドバイスいただけないでしょうか
KSwordOfHaste

2017/12/01 03:21

> GUIクラス視点で処理が進むと思います そういうふうに見えますね。 > UIから値を受け取ったから、コントロールクラスの計算するメソッドを呼び出して… 少し意識が違う気がします。コントローラーはViewとModelの仲介をするだけと考えた方がよいと思います。計算の実体はModelに置くようにすれば大雑把にいってそれがMVCといってもよいでしょう。 > コントロール始点 GUIがコントローラーをcallする、コントローラーがModelをcallするという構造ではなく、ModelがGUIをcallするといったお考えではないかと想像します。そうでしょうか?
nuiri1343

2017/12/01 03:24

Modelとはなんでしょうか?
KSwordOfHaste

2017/12/01 03:29

Modelはそのアプリケーションがやりたい主たる仕事をするものだと考えてください。Javaなどだとクラスとしてそれを表現(実現)します。
nuiri1343

2017/12/01 03:33

なるほど。 GUIクラス←→コントロールクラス←→メインクラス という解釈であってますか?
KSwordOfHaste

2017/12/01 04:06

ちょっと注意を喚起したいのですが、本質問のタイトルは「javaFXにて、Applicationを継承したクラスではない他のクラスから実行したい」です。それにはお答えしたつもりです。 もし尋ねたいことがこのタイトルでは充分表現できていなかったのだとしたら、疑問点を整理し別の質問を挙げた方がよいと思います。 本来ここは質問者さんの遭遇した問題点を解決することのみを目的とはしておらず、Q&Aを通じて多くの閲覧者さんと知識を共有する点が目的と思います。 コメント欄での長いやりとりは多くの閲覧者さんにとって「情報収集する場」としての価値を減じると思います。尋ねたいことは質問文に充分かつ端的に表現するようご注意ください。
nuiri1343

2017/12/01 04:49

その他のクラスから実行したいという部分ですが、 Application.launch(WebViewScrollTest.class, args); この書き方だと、その後メインクラスでの処理というのはできないんですよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問