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

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

ただいまの
回答率

88.78%

クラス間の値渡しの方法について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 389

wasabi723

score 1

StartViewController.java

//このクラスでProducutInfoクラスのオブジェクトを作成し初期値を入力したい
package application;

import java.io.IOException;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class StartViewController {

    @FXML    private Button button_Start;
    @FXML    private Button button_End;
    @FXML    private Label label_title;

    //商品情報の初期化
    String name[] = {"水","お茶","コーヒー","オレンジジュース","ヤクルト","コーラ"};
    int price[] = {90,100,110,120,130,80,150} ;
    int temp[] = {1,2,2,1,2,2};
    int shape[] = {1,2,1,1,2,2};
    int stock[] = {2,2,2,2,2,2};

    @FXML
    void onStartClicked(ActionEvent event) {
        try {
            showSecondWindow();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
    void showSecondWindow() throws IOException
    {
        /*ProductInfo p = new ProductInfo();
        p.Product1(name[0],price[0],temp[0],shape[0],stock[0]);
           p.Product2(name[1],price[1],temp[1],shape[1],stock[1]);
           p.Product3(name[2],price[2],temp[2],shape[2],stock[2]);
           p.Product4(name[3],price[3],temp[3],shape[3],stock[3]);
           p.Product5(name[4],price[4],temp[4],shape[4],stock[4]);
           p.Product6(name[5],price[5],temp[5],shape[5],stock[5]);
           */


        //for(int i = 0;i < product.length;i++) {
        //    product[i].Product(name[i], price[i], temp[i], shape[i], stock[i]);
        //}

        FXMLLoader loader = new FXMLLoader(getClass().getResource("ModeView.fxml"));
        BorderPane root = (BorderPane) loader.load();
        Scene scene = new Scene(root);
        Stage stage = new Stage();
        stage.setScene(scene);

        stage.showAndWait();
    }

    @FXML
    void onEndClicked(ActionEvent event) {

    }


}


ProductInfo.java

//商品情報を格納するクラス
package application;

public class ProductInfo
{
    static String name;    //商品名
    static int        price;    //価格
    static int        temp;    //温度
    static int        shape;    //形状
    static int        stock;    //在庫数
    static String strTemp;
    static String strShape;

    public void Product(String name2, int price2, int temp2, int shape2, int stock2)
    {

        name = name2;
        price = price2;
        temp = temp2;
        shape = shape2;
        stock = stock2;

        if (shape == 1)
            strShape = "ペットボトル";
        else
            strShape = "缶";
        if (temp == 1)
            strTemp = "温";
        else
            strTemp = "冷";
    }

    public String outName()
    {
        return name;

    }
    public int outPrice()
    {
        return price;
    }
    public String outTemp()
    {
        return strTemp;
    }
    public String outShape()
    {
        return strShape;
    }
    public int outStock()
    {
        return stock;
    }
}

BuyViewController.java

//この画面に商品情報を表示したい
package application;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Window;


public class BuyViewController {

    @FXML    private Label lavel_Title;
    @FXML    private Label lavel_Sumitted;
    @FXML    private Button button_Back;
    @FXML    private Label shohin1;
    @FXML    private Label shohin2;
    @FXML    private Label shohin3;
    @FXML    private Label shohin4;
    @FXML    private Label shohin5;
    @FXML    private Label shohin6;

    void output()
    {

    }
    @FXML
    void onBackClicked(ActionEvent event) {
        Scene scene = ((Node) event.getSource()).getScene();
        Window window = scene.getWindow();
        window.hide();

    }

}

 前提・実現したいこと

JavaFxを用いて自動販売機を模したシステムを大学の課題で作成しています。
商品情報をクラス間(ウインドウ間)で値を保持して表示したり、在庫数の変更などを行いたいです。
現在StartViewControllerクラスで商品情報(商品名や価格)をまとめるProductInfoクラスのオブジェクトを作成し初期値を代入しました。これを今度はBuyViewControllerクラスで表示したいです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • wasabi723

    2020/08/24 09:13

    大変失礼いたしました。修正いたしました

    キャンセル

  • dameo

    2020/08/24 09:17

    今確認できる環境がないので、参考リンクだけ。FXMLLoaderから、Controllerを取得する方法があるようです。
    「パラメータを渡すJavaFX FXML」
    https://qastack.jp/programming/14187963/passing-parameters-javafx-fxml

    キャンセル

  • wasabi723

    2020/08/24 09:21

    ありがとうございます。参考リンクをもとに自分でも再考致します。
    不手際でご迷惑をおかけし申し訳ございません。

    キャンセル

回答 4

checkベストアンサー

0

参考

画面オブジェクトのプロパティが変更された場合、他のオブジェクトに通知(変更)する機能はあります。
『すべての人のためのJavaプログラミング 第3版』立木秀樹、有賀妙子著 共立出版
ダウンロードファイル:  javaEveryoneAnswer302.jar 

第14章 イベント処理  - 14.5/14.6
HSBColorMaker.java
HSBColorMaker2.java

第14章をすべて読むことをお勧めします。これ以上はノーコメントです。

追記

質問内容が変化したので、イベントベースでオブジェクトを関連づけるパターンを追記します

  • Observerパターン
  • MVC

『オブジェクト指向における再利用のためのデザインパターン 改訂版』
ガンマ、ジョンソン、ヘルム、プリシディーズ 著 1999年 ソフトバンククリエイティブ

『ソフトウェアアーキテクチャ - ソフトウェア開発のためのパターン体系』
ブッシュマン、ローネルト、スタル、ムニエ、ゾンメルラード 著 2000年 近代科学社

Java 9 よりjava.util.Observer、java.util.Observableは非推奨になりました。自作は容易です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/25 07:09 編集

    ソースコードを見ればわかりますが、画面の部品のプロパティを双方向にバインディングすることはできます。
    MVCの知識が多少あるなら、具体的なコードで関連づけを質問してください。検索すればMVCのコードは大量に見つかります。
    modelとView,Controllerの対応が1対nの例を探してください。

    キャンセル

0

Aから送る場合
C.setB(B);

Cで受け取る場合
B = A.getB();

値渡しがディープコピーのことを言っているのであれば、
(JAVAにはそもそも値渡ししかない)
Aから送る場合
C.setB(B.clone());
(もしくはC側で受けたものをcloneする)

Cで受け取る場合
B = A.getB().clone();
(もしくはA側でcloneしたものを渡す)

少し修正しました。この状態でA,B,Cは、各クラスのインスタンス(の参照を格納する変数)です。
データを双方で変更したいのであれば、ディープコピーではなく、インスタンスの参照を共有すれば
片方の変更はもう片方で参照したときにも反映されます。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/24 09:12

    回答ありがとうございます。
    A,B,Cはそれぞれクラス名を入れればいいのでしょうか?いまいち構文が分からず...
    ただディープコピーに関して学習したのですが、ディープコピーはあくまでコピーであり値の変更があったときには反映されないという認識でお間違えないでしょうか?商品購入後在庫が減る仕組みをいれたいのでディープコピーではないような気がしています。コードを追加したので再度お力添えいただけると幸いです。

    キャンセル

0

そのクラスのインスタンスを渡しておけば、それ経由でアクセスできますよ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/24 09:09

    回答ありがとうございます。私もそのような考えではあったのですが知識不足でコードがかけず、、、でした。コードを追加致しましたのでお力添えいただけますと幸いです。

    キャンセル

0

全て(と書くと語弊があるg)のデータを保持するDataクラスを作って、A, B, Cクラスで共有する。
フォーム(ユーザーに見せる)クラスにデータ操作をさせるのは控える。

という作りを勧めます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/08/24 09:07

    回答ありがとうございます。そのようなロジックも考えたのですがDataクラスに情報を集約する場合各viewのクラスでオブジェクトを作成することになると考えたのですが、そのデータは他のクラスでも反映されるのでしょうか?

    キャンセル

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

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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