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

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

詳細はこちら
JavaFX

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

Q&A

解決済

1回答

1321閲覧

postgresqlを使い、データベースから複数の検索結果を、全てGUIに出力させたい

unity3dbigginer

総合スコア65

JavaFX

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

0グッド

0クリップ

投稿2019/12/10 09:13

編集2019/12/10 14:17

##初めに
現在、郵便番号のデータベースを用いて、住所を入力して、ヒットする結果を、全てGUI上に出力させようとしています。

##使用環境
windows10
NetBeans
PgAdmin4
Ubuntu

##現在の状態
検索結果が1件のみの場合、出力は1つでいいですが、複数ヒットした場合、全ての都道府県、市区町村、町名、郵便番号を出力させたいです。

現在、検索結果が1件の場合は正しく動作するのですが、複数ヒットした時、最後の1件のみが出力されてしまい、全てを出力することができていません。

##ソースコード(GUI部分)

Java

1Label label6 = new Label("郵便番号"); 2 HBox pane5=new HBox(label6); 3 pane5.setAlignment(Pos.CENTER); 4 5 Label pref = new Label(""); 6 Label city = new Label(""); 7 Label area= new Label(""); 8 Label zip=new Label(""); 9 HBox pane6=new HBox(30,pref,city,area,zip); 10 pane6.setAlignment(Pos.CENTER); 11 12 13 Button button2 = new Button("戻る"); 14 HBox pane8 = new HBox(button2); 15 pane8.setAlignment(Pos.CENTER); 16 17 VBox pane7 = new VBox(10,pane5,pane6,pane8); 18 pane7.setAlignment(Pos.TOP_CENTER); 19 Scene scene2 = new Scene(pane7,1000,1000);

##ソースコード(検索部分)

Java

1String sql = "SELECT * FROM zip WHERE pref='"+PREF+"' AND city='"+CITY+"'"; 2 Statement st = con.createStatement(); 3 ResultSet rs = st.executeQuery(sql); 4 while (rs.next()) { 5 pref.setText(rs.getString("pref")); 6 city.setText(rs.getString("city")); 7 area.setText(rs.getString("area")); 8 zip.setText(rs.getString("newzip")); 9 } 10 primaryStage.setScene(scene2);

##コードの解説(GUI部分)
実際は、検索画面のScene1と検索結果を出力するScene2の2つがあります。
ここでは、問題のScene2のみを貼らせて頂きます。

ここでは、Labelのpref,city,area,zipに、それぞれ検索結果の都道府県、市区町村、町名、郵便番号を格納して、出力しています。

##コードの解説(検索部分)
実行するsql文を指定し、whileの部分で、該当する住所のデータを、pref,city,area,zipにそれぞれ格納しています。

##やりたいこと
理想は、検索結果が10件の場合、
このwhileの部分でpref,city,area,zipのデータのセットが10セット作られて、GUIに出力したいです。
しかし、実際は最後の1件のみが出力されています。

##試したこと、考察
Scene2のLabelのpref,city,area,zipの出力の部分が、それぞれ1つしか用意されてないので、1つしか出力できないのだと考えています。
しかし、だとすると、検索結果が何件ヒットするかわからない状態でいくつLabelを宣言しないといけないのかわからないので、どうすればいいのかわかりません。

##最後に
追加情報は載せますので、ご教授お願いします。

##改変した内容
コードの変更(検索の部分)

Java

1while (rs.next()) { 2 Label p = new Label(rs.getString("pref")); 3 Label c= new Label(rs.getString("city")); 4 Label a = new Label(rs.getString("area")); 5 Label z = new Label(rs.getString("zip")); 6 pane6.getChildren().addAll(p, c, a, z); 7 }

コード(GUIの部分)の変更はありません。

実行結果のエラー文

org.postgresql.util.PSQLException: この ResultSet に列名 zip ありません。

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

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

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

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

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

m.ts10806

2019/12/10 09:35

>日本語がぐちゃぐちゃで説明がへたくそになっています 自覚があるのでしたら納得いくまで修正してください。そのうえで内容確認します。
unity3dbigginer

2019/12/10 10:13

一応、今のこの状態に修正してみました
guest

回答1

0

ベストアンサー

原因についてはご推察のとおりだと思います。

必要なラベルの数は、4(pref, city, area, zip) × 検索結果の数 で計算できます。

検索を実行してからラベルの数を決定し、必要数だけラベルを作成してペインに追加してください。あるいは、以下の例に挙げるように、結果行が出現するたびにラベルを作成し、 Pane に追加してください。

検索コードの部分は以下のような感じになると思います(変数の持ち方等どうなっているかわからないので雰囲気だけ)。

java

1String sql = "SELECT * FROM zip WHERE pref='"+PREF+"' AND city='"+CITY+"'"; 2Statement st = con.createStatement(); 3ResultSet rs = st.executeQuery(sql); 4while (rs.next()) { 5 Label pref = new Label(rs.getString("pref")); 6 Label city= new Label(rs.getString("city")); 7 Label area = new Label(rs.getString("area")); 8//Label zip = new Label(rs.getString("zip")); 9 Label zip = new Label(rs.getString("newzip")); 10 pane6.getChildren().addAll(pref, city, area, zip); 11}

投稿2019/12/10 11:29

編集2019/12/10 15:20
R.Mizukami

総合スコア1086

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

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

unity3dbigginer

2019/12/10 14:14

検索した結果から変数を定義する方法が、調べたらあまりおすすめされる方法ではない(リファクタリング?と呼ばれるもの)のため、2つめの方を参考にさせて頂きました。 参考にして、コードを書いてみたのですが、エラーを吐いてしまいます。 質問を更新するので、見て頂けないでしょうか。
R.Mizukami

2019/12/10 15:21

エラー文に書いてある通り、カラム名の間違いですね。最初に間違えたのは私みたいですが……。
unity3dbigginer

2019/12/11 05:45

あ、すみません。 私自身もこれに気づいてませんでした笑 参考にした結果、うまく行きました! 最後に、検索結果をpaneに追加していき、 新しい検索をするとき、以前の検索結果を削除する方法はご検討つきますでしょうか。
unity3dbigginer

2019/12/11 08:49

pane.getChildren(),removeAll();でできました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問