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

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

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

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

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

4回答

1209閲覧

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

wasabi723

総合スコア1

JavaFX

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

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2020/08/22 16:46

編集2020/08/24 00:02

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クラスで表示したいです。

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

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

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

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

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

dameo

2020/08/23 23:43

まずはコードを書きましょう。 .javaも.fxmlもなくJavaFxと言われても適切な返事が出来ないと思いますよ。
dameo

2020/08/24 00:03

回答者が質問者より時間を使うことはありません。いい加減なことをしているといい加減な返事しかしないと思います。インデントくらい適切にしてください。
wasabi723

2020/08/24 00:04

大変失礼致しました。実現したいことに対しての知識不足でコードをかくことすらできなかったのであげておりませんでした。現在かけた部分だけではありますが追加いたしました。恐れ入りますがお力添えいただけますと幸いです。
wasabi723

2020/08/24 00:13

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

2020/08/24 00:21

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

回答4

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/24 00:54

編集2020/08/24 22:03
xebme

総合スコア1081

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

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

xebme

2020/08/24 22:26 編集

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

0

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

という作りを勧めます。

投稿2020/08/23 00:50

Q71

総合スコア995

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

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

wasabi723

2020/08/24 00:07

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

0

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

投稿2020/08/22 23:15

y_waiwai

総合スコア87749

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

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

wasabi723

2020/08/24 00:09

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

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/22 20:56

編集2020/08/24 03:50
amiya

総合スコア1218

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

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

wasabi723

2020/08/24 00:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問