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

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

ただいまの
回答率

90.35%

  • JavaFX

    408questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,265

serona

score 17

前提・実現したいこと

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

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("こんにちは")
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/01 14:01 編集

    早々の回答、ありがとうございます!取り急ぎお礼としてコメントさせて頂きます。
    なるほど、そんなことができるんですね……!勉強不足でした><

    まだまだ調べている段階なのですが、
    今まで1つのFXMLファイルと1つのコントローラークラスに全部書いていたものを、
    複数のFXMLファイルに分け、それぞれに対応した子コントローラークラスを作ってその中に処理を書き、
    親となるコントローラークラスが子コントローラークラスから処理を呼び出してくることで
    クラス分割?を行なう……という解釈で合ってますでしょうか?

    兎に角、問題解決の切り口になりそうです。感謝です!!(*^^*)
    もう少し調べたり試したりしてみます!!

    キャンセル

  • 2017/02/01 14:18

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

    キャンセル

  • 2017/02/02 15:12

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

    キャンセル

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

  • JavaFX

    408questions

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