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

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

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

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

Q&A

解決済

1回答

5227閲覧

JavaFX CombBoxに値をsetしたい

katare

総合スコア15

JavaFX

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

0グッド

0クリップ

投稿2017/03/08 08:36

編集2017/03/09 04:54

JavaFX CombBoxにTableViewから取得した値や、Databaseからの値をもとにレコードを選択したいと考えております。
現在は、cmbCombBox.getSelectionModel().select(i);
これを、AccessなどのCombBoxのように値をセットすると該当のレコードが表示されるようにできないでしょうか?

開発環境は、Luna 4.4.2です。

JavaFX

1// CombBoxクラス 2public class cmbSyainID { 3 private final SimpleIntegerProperty iSyainID = new SimpleIntegerProperty(); 4 private final SimpleStringProperty sSyainName = new SimpleStringProperty(); 5 6 public cmbSyainID() { 7 this (0,""); 8 } 9 public cmbSyainID (Integer id, String name) { 10 setSyainID(id); 11 setSyainName(name); 12 } 13// ――――――――――――――――――――――――――――――――――――――――――――――――――――― 14 public Integer getSyainID() { 15 return iSyainID.get(); 16 } 17 public void setSyainID(Integer id){ 18 iSyainID.set(id); 19 } 20 public String getSyainName() { 21 return sSyainName.get(); 22 } 23 public void setSyainName(String name) { 24 sSyainName.set(name); 25 } 26 public void setSelectedItem(Integer id) { 27 iSyainID.set(id); 28 } 29 public Integer getSelectedItem() { 30 return iSyainID.get(); 31 } 32// ――――――――――――――――――――――――――――――――――――――――――――――――――――― 33 public int getValue() { 34 return iSyainID.get(); 35 } 36 public void setValue(Integer id) { 37 iSyainID.set(id); 38 } 39 public String getText() { 40 return sSyainName.get(); 41 } 42 public void setText(String name) { 43 sSyainName.set(name); 44 } 45 public String toString() { 46 return sSyainName.get(); 47 } 48} 49// Controllerクラス 50public class SyainController implements Initializable { 51 @FXML ComboBox<cmbSyainID> cSyainID; 52 @FXML TableView<LstSyain> LstSyain; 53 @FXML TextField tSyainName; 54 55 Integer iBusyoID = 10; 56 PreparedStatement pstmt = null; 57 ResultSet rset = null; 58 59 @Override 60 public void initialize(URL url , ResourceBundle rb) { 61// * CombBox List 62// ――――――――――――――――――――――――――――――――――――――――――――――――――――― 63 setSyainList(); 64 cSyainID.getSelectionModel().select(0); 65 66// * TableView List 67// ――――――――――――――――――――――――――――――――――――――――――――――――――――― 68 LstSyain.getItems().setAll(returnSyainList()); 69 70 LstSyain.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<LstSyain> () { 71 @Override 72 public void changed(ObservableValue<? extends LstSyain> value, LstSyain oldValue, LstSyain newValue) { 73 if (LstSyain.getSelectionModel().getSelectedItem() != null) { 74 //getSyainName()は、LstSyainクラスにて宣言 75 tSyainName.setText((String) newValue.getSyainName()); 76 // ※※※※※※※※※※※※※※※※※※※※※※※※※※※ 77 //Listの動きに伴って、CombBoxの値も変更したい 78 //今回指摘して頂いた ⇒ select(T item) (B)選択すべきアイテムのvalueを指定をしてるつもり 79 cSyainID.getSelectionModel().select(newValue.getSyainID()); 80 // ※※※※※※※※※※※※※※※※※※※※※※※※※※※ 81 } 82 } 83 }); 84} 85 // * CombBox List. 86 //────────────────────────────── 87 public void setSyainList() { 88 String strSQL = "Execute dbo.PStad" 89 + " @NN = 'CBoxSource'" 90 + ", @BusyoID = " + Integer.toString(iBusyoID); 91 92 PreparedStatement pstmt = null; 93 ResultSet rset = null; 94 95 List<cmbSyainID> ll = new LinkedList<cmbSyainID>(); 96 cmbSyainID roww = new cmbSyainID(); 97 98 // ────────────────────────────── 99 try { 100 Connection con = DBConnect.connect(); //DBConnec Connectionクラス 101 pstmt = con.prepareStatement(strSQL); 102 rset = pstmt.executeQuery(); 103 104 while (rset.next()) { 105 roww = new cmbSyainID(); 106 roww.setSyainID(rset.getInt(1)); 107 roww.setSyainName(rset.getString(2)); 108 ll.add(roww); 109 } 110 rset.close(); 111 pstmt.close(); 112 } catch (Exception e) { 113 e.printStackTrace(); 114 } 115 cSyainID.getItems().setAll(ll); 116 } 117 118 // * TableView List. 119 //────────────────────────────── 120 private List<LstSyain> returnSyainList() { 121 Integer iID = 100; 122 123 PreparedStatement pstmt = null; 124 ResultSet rset = null; 125 List<LstSyain> ll = new LinkedList<LstSyain>(); 126 127 try { 128 Connection cnn = DBConnect.connect(); 129 String strSQL = "Execute dbo.PStad" 130 + " @nn = 'ListReturn'" 131 + ", @ID = " + Integer.toString(iID); 132 133 pstmt = cnn.prepareStatement(strSQL); 134 rset = pstmt.executeQuery(); 135 136 int i = 0; 137 while (rset.next()) { 138 i = i + 1; 139 //────────────────────────────── 140 Integer id = rset.getInt(1); 141 String name = rset.getString(2); 142 143 //━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 144 // 一番上のレコードの値ををコントロールに表示 145 if (i == 1) { 146 //※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 147 // select(i) indexではなくValueでSelectしたい 148 // cmbCombBox.select(T item) 149 cSyainID.getSelectionModel().select(id); 150 //※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 151 tSyainName.setText(name); 152 } 153 //━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 154 155 LstSyain roww = new LstSyain(); 156 roww.setSyainID(id); 157 roww.setSyainName(name); 158 159 ll.add(roww); 160 } 161 rset.close(); 162 pstmt.close(); 163 } 164 catch (Exception e) { 165 e.printStackTrace(); 166 } 167 return ll; 168 } 169}

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

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

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

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

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

guest

回答1

0

ベストアンサー

結論を申し上げると「できます」なのですが・・・ご質問のコードを拝見すると少々混乱します。

// select(i) Row_Count()でなくValueでSelectしたい

// cmbCombBox.setSelectItem(nameid)な感じ
cmbCombBox.getSelectionModel().select(nameid);

はっきりわかりませんが、勘違いされている可能性もあるのでその点を指摘しておきます。ComboBox<T>には選択状態を変更するためのオーバーロードされたメソッドが2つあります。

select(int index) // (A)選択すべきアイテムのindexを指定
select(T item) // (B)選択すべきアイテムのvalueを指定

コードではIntegerをselectに渡しておられます。JavaではintとIntegerはboxing/unboxingにより暗黙変換されるのですが、オーバーロードされたメソッドの解決においてはint/Integerは区別して扱われます。ご質問のコードではcmbCombBoxをどのような型として宣言しているのか不明ですが、宣言のしかたによって意味が変わる可能性があります。

ComboBoxの型パラメータ起動されるメソッド
Integer,Number,Objectなど(B):valueにより選択
?, Longなど(A):indexにより選択

さて、ComboBoxは「あらかじめitemsプロパティーに設定した値のリストの中から特定の値を選ぶ」ためのコントロールです。ご質問のコードにはitemsプロパティーに何が設定されているのか不明ですが、DBのresultsetをitemsの内容と仮定するなら、以下のようにすべきです。(nameidは重複がないと仮定しています)

java

1// cmbCombBoxの型はComboBox<Integer>であると仮定 2... 3int i = 0; 4while (rset.next()) { 5 i++; 6 ... 7 Integer nameid = rset.getInt(3); 8 ... 9 cmbCombBox.getItems().add(nameid); // 各行を読み込む度にitemsへ追加 10 if (i == 1) { 11 tfName.setText(nama); 12 cmbCombBox.getSelectionModel().select(nameid); // valueにより選択 13 dtfKeiyakuDay.setValue(DateTimes.toLocalDate(date)); 14 } 15 ... 16} 17...

投稿2017/03/08 13:57

編集2017/03/08 14:05
KSwordOfHaste

総合スコア18392

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

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

katare

2017/03/09 01:03

今回も丁寧な回答ありがとうござました。 KSwordOfHaste様がおっしゃるとおり、理解が浅いままwebで調べて機能実装を優先し開発をすすめています。 今回もCombBoxのselectをitemとindexで行っているのですが、理解なく行っていたようです。 質問文を少し変更させて頂きました。 自分なりにも調査しまして、今回はChoiceBoxでやりたいことができるか調べてみようと考えています。 根本的な解決ではないのですが、select(index)をid一致まで回して取得するよりはスマートかと・・・。
KSwordOfHaste

2017/03/09 03:41 編集

質問文にある「レコードを選択」というのはTableViewの行とComboBoxの選択アイテムを連携することだとは思ったのですが、回答に書いたようにComboBoxの操作について混乱があったようなのでとりあえず単一のComboBoxのアイテムの選択にしぼって回答しました。 さて変更されたコードを拝見しました。コードの一部を省略するのはいいのですが例えばローカル変数のタイプミスとおぼしき部分があったりしてコンパイルが通らない状態のソースになっているように見えます。比較的長いソースなのでコンパイルエラーがあるとあなたの意図が間違って読者に伝わる恐れがありますし回答に必要以上の手間がかかります。 余計な論理の部分をとりさってやりたい点を説明するのに最小限必要なだけの短い(かつコンパイル&実行可能な)ソースにするとベターです。
katare

2017/03/09 05:03

ソースの中途半端な修正申し訳ありませんでした。 質問する側の最低限な礼儀がなってなく申し訳ないです。 今回は、SQL側でCombBoxの一番上にselectしたいデータがくるようにすることで逃れたいと思います。 ChoiceBoxの回答でもKSwordOfHaste様のものを拝見しましたが、現状私が実装するには理解が足りないようです。 次回挑戦したいと思います。 今回は、不躾な回答依頼に対応頂きありがとうございました。
KSwordOfHaste

2017/03/09 05:44

本件は内容的によくないわけではないと思います。むしろ回答者や同様の課題に取り組んでおられる方々にも参考になり得る題材だと感じますし、不躾などとは思っておりません。 ある程度複雑なものは質問も回答もどこまで書くのがよいか難しいですね。自分の回答は今一つ役立ってない気がするのでBAを付けていただくのは却って心苦しいです。 なお、「コンパイルが通るコードを書こう」というのは気を付けた方がよいでしょう。質問・回答双方にいえる話だと思いますw;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問