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

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

ただいまの
回答率

88.10%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,267

score 56

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

ObservableList<ButtonProp> buttonprop buttonprop=FXCollections.observableArrayList( new ButtonProp("123","456") ,  new ButtonProp("aaa","bbb"));
tableview.setItems(buttonprop);
tableview.setEditable(true);
propertyvalue.setCellFactory(new Callback<TableColumn<ButtonProp,String>, TableCell<ButtonProp,String>>() {
 @Override
 public TableCell<ButtonProp, String> call(TableColumn<ButtonProp, String> arg0) {
 return new TextFieldTableCell<>(new DefaultStringConverter());
 }
});
propertyname.setCellValueFactory( new PropertyValueFactory<>("propertyname"));
propertyvalue.setCellValueFactory( new PropertyValueFactory<>("propertyvalue"));

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

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

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


元々は、以下のような実装を考えていました。
>Button1: {"key1": "1", "key2": "2"}
>Button2: {"key1": "1","key3": "3", "key4": "3"} 

Button1をクリックしたら、

key value
key1 1
key2 1

Button2をクリックしたら、

key value
key1 1
key3 3
key4 3

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

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

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

key value
key1 11
key2 12

Button2をクリックしたら、

key value
key1 21
key2 22

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 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をテーブルへどのように表示したいのですか?

key1 key2 key3 key4
1 2
3 4

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

key value
key1 1
key2 2
key3 3
key4 4

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/09 21: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にはどのように
    指定すべきでしょうか??

    説明が下手で申し訳ございませんが、よろしくおねがいいたします。。

    キャンセル

  • 2017/05/10 06:25

    数行ならいいのですが、コメント欄に長いコードを提示するのはご遠慮ください。コメント欄では字下げがつけられないですし、コードを提示するなら質問文を編集するべきです。

    またコメントではQ&Aいずれも数行のやりとりでおさまる程度の内容が適切です。質問者さんはモデルをどう作るかについて問題をかかえておられるようなので回答欄にアドバイスを追加してみます。

    キャンセル

  • 2017/05/10 20:36

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

    キャンセル

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

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

関連した質問

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