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

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

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

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

Q&A

解決済

1回答

5677閲覧

JavaFXでのクラス分割について

serona

総合スコア25

JavaFX

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

0グッド

2クリップ

投稿2017/02/01 04:16

###前提・実現したいこと
独学で勉強している初心者です。
はじめたばかりで知識が乏しいので、用語等間違っていたりしたらすみません……><

JavaFXでGUIプログラミングがやりたいです。
開発環境は、eclipceを使用してます。
Scene Builderを使ってラベルやボタンなどを配置し、
コントローラークラスに実装の追加?というのを行いました。
作り方としては、こちらのサイトを参考にしました。
http://nobotta.dazoo.ne.jp/blog/?p=1335

以下のような感じで書いてるのですが、
例えば、label1のテキストを、コントローラークラス以外の
クラスのメソッド内で変更したい場合には、どうしたらいいのでしょうか?

実際に作っているのは、もっと色々なラベルやボタンなどを配置していて
やりたい処理も、1つのラベルのテキストの変更だけではなく、たくさんあります。
それらを全部コントローラークラスに書くのは良くないと思うのですが
自分の力では、クラス分け?がうまくできなかったので質問させて頂きました。

###該当のソースコード
このコードは、実際に書いているものではないので、おかしいところや足りないところがあったら教えて下さい。

ボタンをクリックした時、ラベルに「こんにちは」と表示させる処理を別のクラスに分けたいのですが
以下のような形だとエラーが出てしまいます。

処理がこれだけなら、button1Clikedに直接「label1.setText("こんにちは");」と書けばいいのですが><
実際に書いているコードだと、コントローラークラスが何千行にもなってしまってます。
クリックされた後の処理を、別のクラスに書きたい場合どうしたらいいのかについて、お教え願います!

####Controller.java

package application; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Label; import javafx.scene.control.Button; public class Controller implements Initializable { @Override public void initialize(URL location, ResourceBundle resources) { } @FXML private Label label1; @FXML private Button button1; @FXML private void button1Cliked(javafx.scene.input.MouseEvent aEvent) { Test test = new test(); test.Hello(); } public void setLabelText(String text) { label1.setText(text); } }

####Test.java

package application; public class Test { public void Hello() { Controller controller = new Controller(); controller.setLabelText("こんにちは") } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

FXMLは入れ子にすることができます。
参考:http://d.hatena.ne.jp/hagi44/20130621/1371827337

画面をある程度切り分けて考えて、複数のコントローラで一つの画面を構成するようにすれば、一つのコントローラに膨大な処理を書かずに済みます。ただし、なにも考えずホイホイ切り分けると、AのコントローラでBのコントローラの持つラベルを書き換えたい、などになったときに大変困ります。しっかり考えて分割しましょう。

投稿2017/02/01 04:31

masaya_ohashi

総合スコア9206

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

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

serona

2017/02/01 05:01 編集

早々の回答、ありがとうございます!取り急ぎお礼としてコメントさせて頂きます。 なるほど、そんなことができるんですね……!勉強不足でした>< まだまだ調べている段階なのですが、 今まで1つのFXMLファイルと1つのコントローラークラスに全部書いていたものを、 複数のFXMLファイルに分け、それぞれに対応した子コントローラークラスを作ってその中に処理を書き、 親となるコントローラークラスが子コントローラークラスから処理を呼び出してくることで クラス分割?を行なう……という解釈で合ってますでしょうか? 兎に角、問題解決の切り口になりそうです。感謝です!!(*^^*) もう少し調べたり試したりしてみます!!
masaya_ohashi

2017/02/01 05:18

ちょっと違いますね。ボタンなどのコントロールや、処理そのものをすべて子コントローラに任せることになります。親コントローラは子コントローラを「持つ」だけで子に対して何もしません。もちろん「しない」だけで、コードをかけば「やる」ことはできます。子と子は通常ではお互いを干渉することができないので、子Aが持っているラベルに子Bがアクセスすることはできないので、子Bが親伝いに子Aの処理を呼び出す、などの回りくどいことをしなければなりません。なので、処理を分割する前に、誰に何をもたせるかを考えてから切り分けましょう。もちろん、全てがうまくいく切り分け方をできるとは限らないので、上記のような回りくどいことをすることもあります。 一応、子Aから子Bの要素へ直接アクセスする方法としては、子BのコントロールからSceneを取得→Scene#lookupを使いfx:idで指定して子AのNodeを得るという方法がありますが、ちょっと未検証なのでほんとに動くかどうかはわかりません。
serona

2017/02/02 06:12

理解不足で、度々すみません><確認ありがとうございます!! なるほど、そういうことなんですね。 具体的な方法まで提案して頂いて、感謝感激です><また試させてもらいます。 動かせるまでにはまた時間がかかりそうだし、訊きたかった回答は頂けたので まずはベストアンサーに選ばせて頂きます!!(*^^*) 自分でも色々見て、また分からないところがあったら 質問させて貰おうと思います。本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問