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

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

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

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

Q&A

1回答

1943閲覧

JavaFXでボタンに紐付けられたプロパティをリストビューに表示したい

mugichon

総合スコア61

JavaFX

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

0グッド

0クリップ

投稿2017/05/07 04:59

編集2017/05/10 11:58

ボタン毎にプロパティ値を持つようなオブジェクトを作成しています。
ボタンを押したらそのボタンの持つプロパティをリストビューに表示したいと考えていますが、
どのように実装したら良いか全く見当が付きません。。

lang

1ObservableList<ButtonProp> buttonprop buttonprop=FXCollections.observableArrayList( new ButtonProp("123","456") , new ButtonProp("aaa","bbb")); 2tableview.setItems(buttonprop); 3tableview.setEditable(true); 4propertyvalue.setCellFactory(new Callback<TableColumn<ButtonProp,String>, TableCell<ButtonProp,String>>() { 5 @Override 6 public TableCell<ButtonProp, String> call(TableColumn<ButtonProp, String> arg0) { 7 return new TextFieldTableCell<>(new DefaultStringConverter()); 8 } 9}); 10propertyname.setCellValueFactory( new PropertyValueFactory<>("propertyname")); 11propertyvalue.setCellValueFactory( new PropertyValueFactory<>("propertyvalue"));

リスト表示するだけであれば上のソースで出来るのですが、
リストビューの中身を変更したときの反映方法(プロパティ値の上書き)や、
ボタンを押す毎にリストビューを書き換える方法、ボタンクラスとの関連付け等、
さっぱりな状態です。

なお、ボタンクラスはButtonを継承してプロパティを持っている状態です。

こんな状態ですが、よろしくお願いいたします。


元々は、以下のような実装を考えていました。

Button1: {"key1": "1", "key2": "2"}
Button2: {"key1": "1","key3": "3", "key4": "3"}

Button1をクリックしたら、

keyvalue
key11
key21

Button2をクリックしたら、

keyvalue
key11
key33
key43

という動作を考えていました。
すみません、もっと自然ではないかもしれません。。

ですので、全てのボタンでプロパティのキーは固定で値のみ変更される
という動きが良いかと思っています。

記載頂いたとおり、
Button1: {"key1": "11", "key2": "12"}
Button2: {"key1": "21", "key2": "22"}
とあった場合、Button1をクリックしたら、

keyvalue
key111
key212

Button2をクリックしたら、

keyvalue
key121
key222

を表示されたいと考えています。

すみませんが、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

リストじゃなくTableViewですね?

TableViewへ表示する行単位のデータのことをTableViewのモデルと呼んだりします(一般のMVCモデルでのMです)が、質問者さんのコードではモデルはButtonPropクラスですね。このモデルの中でTableView上で表示・編集したいものをJavaFXプロパティーとして実装してください。そしてそのプロパティーをTableViewの各カラムのcellValueFactoryを設定することでテーブルカラムと結び付けてください。

結び付け方はPropertyValueFactoryリファレンスを参照するとよいでしょう。

この方法を用いればテーブル上のセルの編集をすると、その結果が自動的にモデルのJavaFXプロパティーの値へ反映されます。TableViewのリファレンスの説明も熟読することをお勧めします。

なお、javafx.scene.Node(本件の場合Buttonの派生)をモデルとして直接用いるのはお勧めできません。モデルはモデル、ビューはビューとして設計しましょう。必要ならモデルとButtonの間の関連を別途管理するとよいと思います。


追記:質問コメントにある「モデルの考え方」について追記します。

ボタンを押すことで表示したいモデルがPropertiesのようなものとします。Propertiesは任意の数のキーと値の集合ですね。Propertiesを用いるならボタンによって「キーの種類は様々に変わる」ことを前提に考えるのが自然だと思います。とすればPropertiesを「表示すべき属性名が固定的な」TableViewへ簡単かつ自然にマッピングできないと思います。

例:(JSON形式でPropertiesを表現しています)

Button1: {"key1": "11", "key2": "12"}
Button2: {"key1": "21", "key2": "22"}

このようなモデルのように属性が固定("key1"と"key2")ならテーブルのカラムも"key1"と"key2"とすればモデルインスタンス一つをTableViewの1行に自然にマッピングできますが、

Button1: {"key1": "1", "key2": "2"}
Button2: {"key3": "3", "key4": "3"}

このようなモデルに対してTableViewのカラム名を決められませんよね?
質問者さんはPropertiesをテーブルへどのように表示したいのですか?

key1key2key3key4
12
34

でしょうか?それとも以下のようなイメージですか?

keyvalue
key11
key22
key33
key44

いずれにしても「TableViewへ表示するマッピングは自然とはいえない」と思います。
実装方法云々の前にこの点を明確にしておかないと話がぶれてしまいます。

投稿2017/05/07 08:04

編集2017/05/09 22:08
KSwordOfHaste

総合スコア18394

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

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

mugichon

2017/05/09 12:55

ご回答ありがとうございます。 リストビューでした。。大変失礼しました。 また、モデルとの分離につきまして、ご教示頂きありがとうございました。 まだコードを修正しておりませんので、質問文のコードで改めてご教示いただけますでしょうか。 ButtonPropは以下のようなコードとなっています。 [ButtonProp] public class ButtonProp extends Button{ private PropertiesManager propman = new PropertiesManager(); public boolean LoadProperty(String filename){ if(propman.LoadProperty(filename)){ return true; }else{ return false; } } } [PropertiesManager] public boolean LoadProperty(String filename){ //Properties properties = new Properties(); try { InputStream inputStream = new FileInputStream(filename); properties.load(inputStream); inputStream.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); return false; } return true; } ButtonPropはPropertiesManagerを呼び出し、この中でファイルから呼び出した複数行の プロパティ情報を持っています。 しかし、以下のコードですと、1行=1インスタンスのように記述されています。 >buttonprop buttonprop=FXCollections.observableArrayList( new ButtonProp("123","456") , new ButtonProp("aaa","bbb")); ButtonPropクラスを上記のように呼び出した場合、ボタンがぽこぽこ 出来てしまうように思えますし、何より、複数のプロパティ情報を持つButtonProp クラスで意図した情報を返せないように思えます。 恐らく、ボタンとプロパティを分離した場合も上記のような問題に躓きそうに 思えますが、上記のような状況の場合、observableArrayListにはどのように 指定すべきでしょうか?? 説明が下手で申し訳ございませんが、よろしくおねがいいたします。。
KSwordOfHaste

2017/05/09 21:25

数行ならいいのですが、コメント欄に長いコードを提示するのはご遠慮ください。コメント欄では字下げがつけられないですし、コードを提示するなら質問文を編集するべきです。 またコメントではQ&Aいずれも数行のやりとりでおさまる程度の内容が適切です。質問者さんはモデルをどう作るかについて問題をかかえておられるようなので回答欄にアドバイスを追加してみます。
mugichon

2017/05/10 11:36

回答頂きありがとうございます。 質問文の編集が出来たことに今気付きました。。 以後気をつけます。ご指摘ありがとうございました。 やりたい事を質問文の方を編集させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問