🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaFX

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

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

Q&A

解決済

1回答

1450閲覧

JAVAFX 子ウィンドウで登録処理後、親ウィンドウのリストを更新

katare

総合スコア15

JavaFX

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

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

1グッド

0クリップ

投稿2020/12/25 06:22

環境:Windows10・eclipse_4_4

前提・実現したいこと

親ウィンドウから、子ウィンドウを開き、データの登録をします。
子ウィンドウからは、連続して追加をさせる仕様のため
追加登録をした際に、親ウィンドウのLstZaikoを更新させたい。

エラー内容に関わる情報を検索してみたものの、static云々の情報がでてくるのですが、
Javaに関して、理解が浅いせいもあり、自分のPGへの置き換えでうまく処理を完結させることができませんでした。

controller・class・modelの関係性があやしいので、
その辺を解説してあるようなサイトや書籍も併せてご教授いただければ幸いです。

### 発生している問題・エラーメッセージ スコープ内で形 Zaiko_Controllerのエンクロージング・インスタンスがアクセス不可能です
<Pane prefHeight="590.0" prefWidth="445.0" stylesheets="@style.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Zaiko.Zaiko_Controller"> <children> <Button layoutX="345.0" layoutY="550.0" prefHeight="25.0" prefWidth="100.0" mnemonicParsing="false" onAction="#SyokuZaiAdd" text="食材追加" style="-fx-font-size: 13px; -fx-font-weight: bold; -fx-text-fill: #0009ff;" /> <Label text="ストック" alignment="CENTER" layoutX="10.0" layoutY="10.0" prefHeight="27.0" prefWidth="67.5" /> <TextField text="冷蔵庫1" alignment="CENTER_LEFT" layoutX="77.5" layoutY="10.0" prefHeight="25.0" prefWidth="202.5"/> <TableView fx:id="LstKousyu" layoutX="10.0" layoutY="40.0" opacity="0.7" prefHeight="508.0" prefWidth="435.0"> <columns> <TableColumn prefWidth="0.0" visible="false"> <cellValueFactory> <PropertyValueFactory property="KousyuID" /> </cellValueFactory> </TableColumn> <TableColumn text="食材" prefWidth="225.0"> <cellValueFactory> <PropertyValueFactory property="Syokuzai" /> </cellValueFactory> </TableColumn> <TableColumn text="購入日" prefWidth="97.5"> <cellValueFactory> <PropertyValueFactory property="BuyingDay" /> </cellValueFactory> </TableColumn> <TableColumn text="賞味期限" prefWidth="97.5" > <cellValueFactory> <PropertyValueFactory property="OpenDate" /> </cellValueFactory> </TableColumn> </columns> </TableView> </children> </Pane>
package Zaiko; public class ZaikoApp extends Application { @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("Zaiko.fxml")); stage.setTitle("在庫画面"); stage.setScene(new Scene(root, 455, 590)); stage.show(); } public static void main(String[] args ) { launch(args); } }
package Zaiko; public class LstZaiko { private final SimpleIntegerProperty ZaikoID = new SimpleIntegerProperty(); private final SimpleStringProperty Syokuzai = new SimpleStringProperty(); private final SimpleStringProperty BuyingDay = new SimpleStringProperty(); private final SimpleStringProperty OpenDate = new SimpleStringProperty(); public LstZaiko() { this( 0, "","","" ); } public LstZaiko( Integer zaikoID, String syokuzai, String buying, String open ) { setZaikoID(zaikoID); setSyokuzai(syokuzai); setBuyingDay(buying); setOpenDate(open); } public Integer getZaikoID() { return ZaikoID.get(); } public void setZaikoID(Integer zaikoID) { ZaikoID.set(zaikoID); } public String getSyokuzai() { return Syokuzai.get(); } public void setSyokuzai(String syokuzai) { Syokuzai.set(syokuzai); } public String getBuyingDay() { return BuyingDay.get(); } public void setBuyingDay(String buying) { BuyingDay.set(buying); } public String getOpenDate() { return OpenDate.get(); } public void setOpenDate(String open) { OpenDate.set(open); } }
package Zaiko; public class Zaiko_Controller implements Initializable { @FXML TableView<LstZaiko> LstKousyu; Integer ZaikoID = 0; @Override public void initialize(URL url , ResourceBundle rb) { LstZaiko_Set(); } // 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 public void LstZaiko_Set() { LstKousyu.getItems().setAll(returnLstZaiko()); LstKousyu.getSelectionModel().select(0); } // 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 private List<LstZaiko> returnLstZaiko() { List<LstZaiko> ll = new LinkedList<LstZaiko>(); LstZaiko roww = new LstZaiko(); roww.setZaikoID(1); roww.setSyokuzai("ハム"); roww.setBuyingDay("12月10日"); roww.setOpenDate("12月20日"); ll.add(roww); roww = new LstZaiko(); roww.setZaikoID(2); roww.setSyokuzai("たまご"); roww.setBuyingDay("12月15日"); roww.setOpenDate("12月30日"); ll.add(roww); // 実際は、Stadのレコードをまわして、Listを構成している return ll; } // 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 @FXML public void SyokuZaiAdd(ActionEvent event) { Syokuzai.Syokuzai.show(ZaikoID, "冷蔵庫1"); } }
<Pane fx:id="root" prefHeight="550.0" prefWidth="360.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Syokuzai.Syokuzai_Controller"> <children> <Button layoutX="10.0" layoutY="520.0" prefHeight="25.0" prefWidth="100.0" mnemonicParsing="false" onAction="#SyokuZaiInsert" text="登 録" style="-fx-font-size: 13px; -fx-font-weight: bold; -fx-text-fill: #0009ff;" /> <TableView fx:id="LstSyokuzaiSelect" layoutX="10.0" layoutY="10.0" opacity="0.7" prefHeight="508.0" prefWidth="337.0"> <columns> <TableColumn prefWidth="0.0" visible="false" > <cellValueFactory> <PropertyValueFactory property="SyokuzaiID" /> </cellValueFactory> </TableColumn> <TableColumn fx:id="colSyokuzai" text="食材" prefWidth="225.0" visible="true"> <cellValueFactory> <PropertyValueFactory property="Syokuzai" /> </cellValueFactory> </TableColumn> <TableColumn fx:id="colDefaltOpen" text="賞味期限" prefWidth="97.5" visible="true" > <cellValueFactory> <PropertyValueFactory property="DefaltOpen" /> </cellValueFactory> </TableColumn> </columns> </TableView> </children> </Pane>
package Syokuzai; public class Syokuzai { private static final Syokuzai frm = new Syokuzai(); static int return_SyokuzaiID; public Syokuzai() { } private void open( Window parentWindow, Integer zaikoID, String name) throws IOException { Stage stage = new Stage(); stage.initOwner(parentWindow); stage.setTitle("食材登録"); stage.setResizable(false); stage.initModality(Modality.APPLICATION_MODAL); stage.initStyle(StageStyle.UTILITY); FXMLLoader loader = new FXMLLoader(getClass().getResource("Syokuzai.fxml")); Parent root = (Parent) loader.load(); try { Syokuzai_Controller controller; controller = (Syokuzai_Controller) loader.getController(); controller.setStage(stage); controller.setZaikoID(zaikoID); controller.LstGyousyu_Create(); Scene sence = new Scene(root); stage.setScene(sence); stage.setY(300.0); stage.showAndWait(); } catch (Exception e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } public static int show(Integer zaikoID, String name){ Stage mStage; mStage = new Stage(); try { frm.open(mStage, zaikoID , name); } catch (IOException e) { e.printStackTrace(); } return return_SyokuzaiID; } }
package Syokuzai; public class LstSyokuzaiSelect { private final SimpleIntegerProperty SyokuzaiID = new SimpleIntegerProperty(); private final SimpleStringProperty Syokuzai = new SimpleStringProperty(); private final SimpleStringProperty DefaltOpen = new SimpleStringProperty(); public LstSyokuzaiSelect() { this(0, "",""); } public LstSyokuzaiSelect( Integer id, String name, String open) { setSyokuzaiID(id); setSyokuzai(name); setDefaltOpen(open); } public Integer getSyokuzaiID() { return SyokuzaiID.get(); } public void setSyokuzaiID(Integer id) { SyokuzaiID.set(id); } public String getSyokuzai() { return Syokuzai.get(); } public void setSyokuzai(String name) { Syokuzai.set(name); } public String getDefaltOpen() { return DefaltOpen.get(); } public void setDefaltOpen(String open) { DefaltOpen.set(open); } }
public class Syokuzai_Controller implements Initializable { @FXML Pane root; @FXML private TableView<LstSyokuzaiSelect> LstSyokuzaiSelect; @FXML TableColumn<LstSyokuzaiSelect , String> colSyokuzai; @FXML TableColumn<LstSyokuzaiSelect , String> colBuyingDay; int ZaikoID = 0; PreparedStatement pstmt = null; ResultSet rset = null; private Stage mStage; public void initialize(URL url, ResourceBundle rb) { } public void LstGyousyu_Create() { LstSyokuzaiSelect.getItems().setAll(returnLstSyokuzai()); LstSyokuzaiSelect.getSelectionModel().select(0); } private List<LstSyokuzaiSelect> returnLstSyokuzai() { List<LstSyokuzaiSelect> ll = new LinkedList<LstSyokuzaiSelect>(); LstSyokuzaiSelect roww = new LstSyokuzaiSelect(); roww.setSyokuzaiID(1); roww.setSyokuzai("牛乳"); roww.setDefaltOpen("1週間"); ll.add(roww); roww = new LstSyokuzaiSelect(); roww.setSyokuzaiID(2); roww.setSyokuzai("たまご"); roww.setDefaltOpen("2週間"); ll.add(roww); return ll; } @FXML public void SyokuZaiInsert(ActionEvent event) { LstSyokuzaiSelect list = LstSyokuzaiSelect.getSelectionModel().getSelectedItem(); if (list != null) { int SyokuzaiID = list.getSyokuzaiID(); try { ///// ※ SQL処理の実行で、Table[ZAIKO]のInsertされたと仮定します ///// // 初期化!!!! LstGyousyu_Create(); ctl.MsgBox.MsgBoxYESNO.show("登録完了", "登録しました。","INFO"); // 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ///// ※ 連続登録をさせ、都度 Zaiko[LstZaiko]に反映させたい //Error: スコープ内で形 Zaiko_Controllerのエンクロージング・インスタンスがアクセス不可能です Zaiko_Controller.this.LstZaiko_Set(); // 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 } catch (Exception e) { e.printStackTrace(); } } } // ────────────────────────────── public void setStage(Stage stage) { this.mStage = stage; } public void setZaikoID(Integer id) { ZaikoID = id; } }
TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

Zaiko_Controller.thisはインナークラスから親のインスタンスにアクセスする記法なので、まったく別のクラスでは使えません。

雑にやるならstatic変数に入れておいてこんな感じでしょうか?^^;

Java

1public class Zaiko_Controller implements Initializable { 2 static Zaiko_Controller instance; 3 4 @Override 5 public void initialize(URL url, ResourceBundle rb) { 6 instance = this; 7 LstZaiko_Set(); 8 }

Java

1Zaiko_Controller.instance.LstZaiko_Set();

もう少しまともにやるなら、setZaikoIDと同じようにZaiko_Controllerを差し込むか。

TableViewのモデル(ObservableList)をstaticで持っておいてもいいかもしれません。


言語やフレームワークによらずウィンドウ間のやりとりはハマりポイントなんですが、JavaFXは特に難しいです。

個人的にはウィンドウをパカパカ開くのは好みでないので、単一のウィンドウで済ませられるようにデザインするのを勧めたいです。

投稿2020/12/27 02:26

TN8001

総合スコア9855

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

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

katare

2020/12/27 23:28

回答ありがとうございます。 いろいろな方法があるのですね。 画面の単純化とポップさせるバランスに苦しんでいるんですが、もう一度見直しもしつつ、今回回答頂いた方法で試して見ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問