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

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

ただいまの
回答率

91.34%

  • Java

    10463questions

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

  • JavaFX

    309questions

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

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

受付中

回答 2

投稿 2017/12/01 14:07 ・編集 2017/12/03 19:32

  • 評価
  • クリップ 1
  • VIEW 78

nuiri1343

score 36

前提・実現したいこと

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

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

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

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

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

というように。

通常の、

import javafx.application.Application;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.control.*;

public class HelloWorld extends Application{

 @Override
 public void start(Stage stage){
  Label label = new Label("HelloWorld!!");
  stage.setScene(new Scene(label));
  stage.show();
 }
}


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

public class Main{
 public static void main(String[] args){

  //とりあえず初期画面表示
  //helloworldって画面いっぱいに表示しておく感じで。

  //画面上のどこかをクリックされたら、クリックされた座標のx座標とy座標を足す
  int z = x + y;

  //zをデータベースに登録する

  //次はaかbを選択してほしいので、画面にaとbという名前のボタン2つを配置させる。

  //aならばz*2を、bならばz/2をデータベースに新たに登録する
 }
}

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

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

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

追記

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

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

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

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

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

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

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

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

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

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


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

public class Main{
  public static void main(String[] args){
    //とりあえず初期画面表示
    Window w = showInitialWindow(); //(A)

    //画面上のマウスクリックを待つ
    Point p = w.waitForMouseClicked(); //(B)
    //==> この間はマウスクリック以外は一切受け付けない?
    int z = p.x + p.y;

    //zをデータベースに登録する
    updateDB(z);
    //==> update中は画面操作は一切受け付けない?

    //次はaかbを選択してほしいので、画面にaとbという名前のボタン2つを配置させる。
    w.addButtons("a", "b");                  //(C)
    String clicked = w.waitForButtonClicked(); //(D)
    //==> ボタンのクリック以外の操作は一切受け付けない?

    //aならばz*2を、bならばz/2をデータベースに新たに登録する
    switch (selection) {
    case "a":
      ...
    case "b":
      ...
    }
    ...
  }
}

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

投稿 2017/12/01 15:36

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/02 15:09

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

    キャンセル

  • 2017/12/02 16:05

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

    キャンセル

+1

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

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

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

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

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

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


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

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

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

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


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

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

投稿 2017/12/02 19:47

編集 2017/12/02 20:25

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/02 20:09

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

    キャンセル

  • 2017/12/02 20:28 編集

    コメントありがとうございます。
    私は、KSwordOfHasteさんのように、Javaのフレームワークには詳しくないのですが、
    質問者の方から見て、色々な考え方が見れた方が参考になるので、回答を補完するため書きました。

    >イベントドリブンとは違う方法論での制御
    いろいろなゲームのフレームワークはありますが、
    基本的には、GUIの部品をゲームのメインループから呼ぶ形になると思います。
    要するに、ゲームのキャラクターとかと、同じ扱いにしてしまうわけです。

    ただ、率直に言ってしまうと、ゲーム的GUIは実装コストが高く、
    ビジネスアプリでやっても、十中八九は割に合わないでしょう。
    結果的には、KSwordOfHasteさんの回答にあるように、
    ビジネスアプリならビジネスGUIのやり方に合わせるのが妥当だと、私も思います。

    ただ、今回は不要でも、いつか必要になる場合がないとも限りません。
    それこそ、ゲーム自体を開発したりだとか。
    選択肢を増やしておくのは損がないので、回答しておきました。

    キャンセル

  • 2017/12/02 21:32

    自分はプロの方々と違い興味のあるところだけつまみ食いしているアマチュアにしかすぎませんので詳しいと評されると赤面してしまいます・・・実際穴だらけの知識なので><

    JavaFXはJavaSEに含まれている標準機能で、それだけを使う前提ではイベントドリブンが基本的方法論ではあるものの、LLmanさんがおっしゃるような「GUIの部品をゲームのメインループから呼べる形」のようなフレームワークがあっても不思議でないと感じました。この点技術的な興味を感じます。

    > 今回は不要でも、いつか必要になる場合がないとも限りません。
    おっしゃるとおりと思います。回答の仕方として「JavaFXのみを使う場合の基本はこう」と述べた上で「こういう仕組みにするにはこんなフレームワークや設計が必要になるだろう」といったところまでコメントができたらよかったですね。よい回答をするのは難しいです・・・

    キャンセル

  • 2017/12/02 22: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#の方が開発環境が充実するというわけです。

    まあコーディングには直接関係ないんですが、言語を使う目的や背景を視野に入れると、
    どんな目的に何の言語が向いているか、整理しやすいと思います。

    キャンセル

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

ただいまの回答率

91.34%

関連した質問

同じタグがついた質問を見る

  • Java

    10463questions

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

  • JavaFX

    309questions

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