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

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

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

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

Java

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

Q&A

2回答

450閲覧

javaFXで、GUIクラスではないメインクラスで計算の処理などをしたい。

nuiri1343

総合スコア54

JavaFX

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

Java

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

1グッド

0クリップ

投稿2017/12/01 05:07

編集2017/12/03 10:32

###前提・実現したいこと
通常のGUIクラスでは、基本的にGUIクラスが視点になってプログラムが動いていくことと思います。

GUIクラスが画面にボタンを配置し、GUIクラスが受け取った値を、計算するメソッドを持つクラスに投げて、
計算結果をGUIクラスが受け取り、その値によって、画面の表示を変更する

といった具合に。
GUIクラスが主人公で進んでいくような感じだと思います。

しかし、そうではなく、計算するメソッドを持つ側のクラスが主人公になって進むような
プログラムの書き方はできないでしょうか?

メインラインはGUIとは全く関係のないクラスで進み、ユーザとの情報のやり取りがしたいときに
GUIクラスの応じたメソッドを呼び出すことで画面を変化させる

というように。

通常の、

java

1import javafx.application.Application; 2import javafx.stage.*; 3import javafx.scene.*; 4import javafx.scene.control.*; 5 6public class HelloWorld extends Application{ 7 8 @Override 9 public void start(Stage stage){ 10 Label label = new Label("HelloWorld!!"); 11 stage.setScene(new Scene(label)); 12 stage.show(); 13 } 14}

このようなJavaFXプログラムだと、コマンドプロンプトで実行する際は
java HelloWorld
というようにすると思います。
しかしこれはGUIクラス視点です。

java

1public class Main{ 2 public static void main(String[] args){ 3 4 //とりあえず初期画面表示 5 //helloworldって画面いっぱいに表示しておく感じで。 6 7 //画面上のどこかをクリックされたら、クリックされた座標のx座標とy座標を足す 8 int z = x + y; 9 10 //zをデータベースに登録する 11 12 //次はaかbを選択してほしいので、画面にaとbという名前のボタン2つを配置させる。 13 14 //aならばz*2を、bならばz/2をデータベースに新たに登録する 15 } 16}

例えば上記のようなプログラムを作りたかったとします。
これをコマンドプロンプトで実行するときは、もちろんjava Mainです。

データベース登録処理とかは今回はどうでもいいのですが、
このような、GUI表示とは関係ない処理はMainクラスに書いて、
且つメインクラス視点で物事が進んでいくようにプログラムを書きたいです。

どうやって書いたらいいでしょうか?
アドバイスなどいただけましたら幸いです。
どうかよろしくお願いいたします

###追記
回答してくださった方のお話を参考に、初心者なりに色々と考えてみました。
Mainクラスと、JavaFXクラスを別スレッドにして、
例えば、ボタンが押されるのを待っている状態ならば、
JavaFXクラスではボタンを表示しておいて、ボタンが押されたら特定の変数が変化するようにしておいて、
Mainクラスでは、特定の変数が変化するまで、Whileループで待っているという状態にしたら、
目的の動作は得られるのでしょうか?

マルチスレッドにしないと、Mainクラスがwhileループに入った段階で、その処理につきっきりになるのか、GUIのボタンを押すことができなくなってしまいました。

このやり方で、達成できるのか、それと問題があるのかどうかを教えてください

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答2

0

どうやって書いたらいいでしょうか?

簡単な答えは「そういうふうに書こうとしない方がよい」です。

GUIクラスが主人公で進んでいくような感じ

なせそのように書くかといえばそれは「プログラムの書き方」というよりは「GUIアプリケーションの本質」から自然に導き出されるからといってよいと思います。

質問者さんは「GUIクラス」が主人公と表現されていますが、どちらかといえばそうではなくGUI画面を目の前にした利用者が主人公という視点で捉えてみるとよいと思います。

GUIプログラムではある時点で表示されている画面に対し利用者は色々な選択肢ができるのが普通です。例えば

  • 画面上のクローズボタンを押す
  • 画面上のどこか一点をマウスでクリックする
  • 画面上のボタンをクリックする
  • 画面上のどこかのコントロールにフォーカスがあるときキーを押す
  • 画面が小さいので画面の端をドラッグして画面サイズを大きくする

このような様々な「操作」に応じて「しかるべき動作を直ちに行う」のがGUIアプリケーションの基本です。そうでなければGUIの意味がないといっても過言ではないと思います。

そのようなGUIの制御をするのに

  • 今マウスは押されているか?
  • ではキーは押されているか?

といった判定を毎回しながら論理を書いていくのは大変鬱陶しいので、「何か操作されたらそれに対するハンドラーが自動的に起動される」というイベント駆動型のプログラミングモデルを想定するのが普通と思います。JavaFXに限らず世の大くのGUIシステムがそうなのではないでしょうか?


なお、質問者さんがお考えのような以下のようなプログラムは作れないわけではありません。下の例に書いた(A)~(D)のようなGUI機能はJavaFXには用意されていませんが、書くこと自体はできると思います。

java

1public class Main{ 2 public static void main(String[] args){ 3 //とりあえず初期画面表示 4 Window w = showInitialWindow(); //(A) 5 6 //画面上のマウスクリックを待つ 7 Point p = w.waitForMouseClicked(); //(B) 8 //==> この間はマウスクリック以外は一切受け付けない? 9 int z = p.x + p.y; 10 11 //zをデータベースに登録する 12 updateDB(z); 13 //==> update中は画面操作は一切受け付けない? 14 15 //次はaかbを選択してほしいので、画面にaとbという名前のボタン2つを配置させる。 16 w.addButtons("a", "b"); //(C) 17 String clicked = w.waitForButtonClicked(); //(D) 18 //==> ボタンのクリック以外の操作は一切受け付けない? 19 20 //aならばz*2を、bならばz/2をデータベースに新たに登録する 21 switch (selection) { 22 case "a": 23 ... 24 case "b": 25 ... 26 } 27 ... 28 } 29}

しかしながら、コードのコメントに書いたようにこうした構造だと「今はマウスのクリックしか受け付けない」「今はボタンの選択しか受け付けない」という仕組みになるため、利用者からみて普通のGUIアプリケーションの操作感は達成できないように思います。

投稿2017/12/01 06:36

KSwordOfHaste

総合スコア18394

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

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

nuiri1343

2017/12/02 06:09

つまり、JavaFXに限らず、大抵のGUIアプリケーションでは利用者主人公(システム内ではGUIクラスが主導)であり、 自分が求めるような構築のやり方は推奨できないし、JavaFXでは実現できないということでしょうか?
KSwordOfHaste

2017/12/02 07:05

概ねそうです。正確に言えば「JavaFXでは実現できない」わけではなく作ろうとすれば作れるだろうと思います。ただ、回答に書いたように「それでは利用者が期待するようなものにならない」ため「誰も作ろうとしないのではないか」というのが自分の考えです。 GUI部分に求める機能をもっと限定的にし、「alertを出す」「一時的にグラフを表示する」といった小さな機能に限定するならそういうGUI部品をメソッド呼び出しとして作ることはありかも知れません。別言語になりますが、例えばPythonでバッチ的なプログラムを作る際に「グラフを表示するときだけGUIのウィンドウを表示する」ようなライブラリーが存在します。そういうものならアリかもしれしれませんね。
guest

0

基本的にGUIクラスが視点になってプログラムが動いていく
GUIクラスが主人公で進んでいくような感じ
計算するメソッドを持つ側のクラスが主人公になって進むような
プログラムの書き方はできないでしょうか?

ズバリ簡単に言うと、それはゲームの方法論ですね。

もちろん、質問者の方はゲーム自体を作りたいわけではないでしょう。
しかし、イベントドリブンでなく、GUIに使われるのではなく、
むしろGUIを使うというのは、まさにゲームのGUIの使い方です。

たとえば、ゲームでイベントが起こると、ウィンドウが出たりだとか、
ゲームではゲームの流れが主人公で、それに合わせてGUIを使っていますよね。

だから、「JavaFX ゲーム」などで検索して、ゲーム開発の手法を学びます。
そして、その手法を作りたいものに応用すればいいわけです。

イメージとしては、ボタンやウィンドウなどGUIの部品を自作して、
ゲームのメインループから、それを呼び出して使う感じになると思います。


しかし、ビジネスソフトでそういう作り方は主流ではないですよね。
なぜ主流ではないかというと、手間が掛かりすぎるからです。

もしかしたら、GUIを上手く使うことで、
操作感が向上するジャンルも、本当はあるのかもしれません。

でも、多くの場合、ボタンなどのGUIは固定しておいて、
素直にイベントドリブンにした方が、実装コストが低いから、
ビジネスアプリでは主流になっているわけです。

また、GUIの記述がきゅうくつに感じるなら、いっそGUIを捨ててしまい、
CLIでやる方法もあると思います。事前に決めておける選択肢は、
設定ファイルやDSLに外出しすることで、けっこう頑張れると思います。


UI種類CLIビジネスGUIゲームGUI
実装コスト
UI自由度

さて、ここまでの選択肢を整理すると、上の三つになります。
どれも一長一短なので、作りたい物と、
掛けられるコストの兼ね合いで選択してください。

投稿2017/12/02 10:47

編集2017/12/02 11:26
LLman

総合スコア5592

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

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

KSwordOfHaste

2017/12/02 11:09

ゲームの方法論と聞いてなるほどと思いました。GUIスレッドとは別のスレッドが制御の主導権を握っているようなものが確かにあり、ゲームプログラミングと銘打った解説でそれをよく見る気がします。自分の回答はJavaFXのみを使った場合を想定しているだけですが、何らかのフレームワークがあるとイベントドリブンとは違う方法論での制御が表現できるのだろうと想像しました。自分には知識がないのですが実際にゲーム等の開発用にそういったフレームワークがあるのでしょうね。LLmanさんのより広い視野での解説がとても参考になりました。
LLman

2017/12/02 11:28 編集

コメントありがとうございます。 私は、KSwordOfHasteさんのように、Javaのフレームワークには詳しくないのですが、 質問者の方から見て、色々な考え方が見れた方が参考になるので、回答を補完するため書きました。 >イベントドリブンとは違う方法論での制御 いろいろなゲームのフレームワークはありますが、 基本的には、GUIの部品をゲームのメインループから呼ぶ形になると思います。 要するに、ゲームのキャラクターとかと、同じ扱いにしてしまうわけです。 ただ、率直に言ってしまうと、ゲーム的GUIは実装コストが高く、 ビジネスアプリでやっても、十中八九は割に合わないでしょう。 結果的には、KSwordOfHasteさんの回答にあるように、 ビジネスアプリならビジネスGUIのやり方に合わせるのが妥当だと、私も思います。 ただ、今回は不要でも、いつか必要になる場合がないとも限りません。 それこそ、ゲーム自体を開発したりだとか。 選択肢を増やしておくのは損がないので、回答しておきました。
KSwordOfHaste

2017/12/02 12:32

自分はプロの方々と違い興味のあるところだけつまみ食いしているアマチュアにしかすぎませんので詳しいと評されると赤面してしまいます・・・実際穴だらけの知識なので>< JavaFXはJavaSEに含まれている標準機能で、それだけを使う前提ではイベントドリブンが基本的方法論ではあるものの、LLmanさんがおっしゃるような「GUIの部品をゲームのメインループから呼べる形」のようなフレームワークがあっても不思議でないと感じました。この点技術的な興味を感じます。 > 今回は不要でも、いつか必要になる場合がないとも限りません。 おっしゃるとおりと思います。回答の仕方として「JavaFXのみを使う場合の基本はこう」と述べた上で「こういう仕組みにするにはこんなフレームワークや設計が必要になるだろう」といったところまでコメントができたらよかったですね。よい回答をするのは難しいです・・・
LLman

2017/12/02 13:27 編集

>この点技術的な興味を感じます。 別に、私の知識も穴だらけですし(笑)、今回の本題から外れますが、 ご興味があるようなので、少しゲームの話題に触れましょう。 Javaでは、ゲーム開発やゲームフレームワークが、 そんなに普及していないのはなぜでしょうか? そもそも、Javaはビジネスアプリ向きで、 ゲームを作るならC#の方が充実しています。 じっさい、PS4の開発環境はC#(Mono)です。 これはMSがゲーム機(Xboxシリーズ)を開発してるからでしょう。 ゲームフレームワークも、たとえば、DirectXがありますし、 XNA(ただし開発終了)がありました。UnityでもC#が使えますね。 一方、Javaはビジネス向き、大規模開発向きです。 とくに大企業や官公庁などのエンタープライズ開発向きです。 だから、商用DB最大手のOracleに買収されたわけです。 そうなったのは、さらに元をたどると、JavaがUnix系で強かったからです。 Unixにはオープンソース的な土壌があったので、 (まずアメリカの)教育機関、研究機関、政府機関で採用されました。 それで、現在のエンプラや(Linuxベースの)Androidにまでつながるわけです。 WindowsがパソコンOSが中心なのに対し、Unix/Linux系はサーバOSが中心なんです。 すると、ゲームは個人で遊ぶものなので、C#の方が開発環境が充実するというわけです。 まあコーディングには直接関係ないんですが、言語を使う目的や背景を視野に入れると、 どんな目的に何の言語が向いているか、整理しやすいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問