質問編集履歴
3
FXMLを追記いたしました
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -161,4 +161,31 @@
|
|
|
161
161
|
close();
|
|
162
162
|
return list;
|
|
163
163
|
}
|
|
164
|
+
```
|
|
165
|
+
```FXML
|
|
166
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
167
|
+
|
|
168
|
+
<?import javafx.scene.control.Button?>
|
|
169
|
+
<?import javafx.scene.control.TableColumn?>
|
|
170
|
+
<?import javafx.scene.control.TableView?>
|
|
171
|
+
<?import javafx.scene.layout.AnchorPane?>
|
|
172
|
+
|
|
173
|
+
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="maker.makerControl">
|
|
174
|
+
<children>
|
|
175
|
+
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="400.0" prefWidth="600.0">
|
|
176
|
+
<children>
|
|
177
|
+
<TableView fx:id="fxTableView" layoutX="33.0" layoutY="52.0" prefHeight="296.0" prefWidth="534.0">
|
|
178
|
+
<columns>
|
|
179
|
+
<TableColumn fx:id="fxMakerName" prefWidth="174.0" text="メーカー名" />
|
|
180
|
+
<TableColumn fx:id="fxMakerNameShort" prefWidth="93.0" text="略称" />
|
|
181
|
+
<TableColumn fx:id="fxMakerComment" prefWidth="266.0" text="備考" />
|
|
182
|
+
</columns>
|
|
183
|
+
</TableView>
|
|
184
|
+
</children>
|
|
185
|
+
</AnchorPane>
|
|
186
|
+
<Button fx:id="fxOK" layoutX="523.0" layoutY="361.0" mnemonicParsing="false" onAction="#btnAction" text="F12 保存" />
|
|
187
|
+
<Button fx:id="fxCancel" layoutX="461.0" layoutY="361.0" mnemonicParsing="false" text="F9 取消" />
|
|
188
|
+
</children>
|
|
189
|
+
</AnchorPane>
|
|
190
|
+
|
|
164
191
|
```
|
2
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
DBへの接続は共通化しており、SQLの実行も共通化しています(書き方が怪しいですが)
|
|
7
7
|
### 発生している問題・エラーメッセージ
|
|
8
8
|
|
|
9
|
-
javaFXのテキストには
|
|
10
9
|
以下のmakerControlクラスのshowTableメソッドでエラーが発生しています。
|
|
11
10
|
DBから取得した表(ObservableList)をTableViewへセットする際に発生しているようですが、デバッグモードで見ても表に値は入っているようです。
|
|
12
11
|
どういった原因が考えられるでしょうか。
|
1
途中で送信されていました。申し訳ございません。
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -1,24 +1,165 @@
|
|
|
1
|
+
JavaFXで、共通化したSQL実行から取得した表をTableViewに表示させたい
|
|
2
|
+
|
|
1
3
|
### 前提・実現したいこと
|
|
2
4
|
|
|
3
5
|
postgeSQLとJavaFXを使って様々なデータを参照、登録できるようなシステムを作ろうとしています。
|
|
4
|
-
|
|
6
|
+
DBへの接続は共通化しており、SQLの実行も共通化しています(書き方が怪しいですが)
|
|
5
|
-
|
|
6
7
|
### 発生している問題・エラーメッセージ
|
|
7
8
|
|
|
9
|
+
javaFXのテキストには
|
|
10
|
+
以下のmakerControlクラスのshowTableメソッドでエラーが発生しています。
|
|
11
|
+
DBから取得した表(ObservableList)をTableViewへセットする際に発生しているようですが、デバッグモードで見ても表に値は入っているようです。
|
|
12
|
+
どういった原因が考えられるでしょうか。
|
|
8
13
|
```
|
|
14
|
+
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
|
|
15
|
+
at com.stockon.maker.makerControl.showTable(makerControl.java:116)
|
|
9
|
-
|
|
16
|
+
(以下略)
|
|
10
17
|
```
|
|
11
18
|
|
|
12
19
|
### 該当のソースコード
|
|
20
|
+
長くなりますので、関係ない箇所は省略しています。
|
|
21
|
+
```Java
|
|
22
|
+
public class makerModel {
|
|
13
23
|
|
|
24
|
+
private String makerName;
|
|
25
|
+
private String makerNameShort;
|
|
26
|
+
private String makerComment;
|
|
27
|
+
|
|
28
|
+
public makerModel(String name, String nameShort, String comment) {
|
|
14
|
-
|
|
29
|
+
this.makerName = name;
|
|
30
|
+
this.makerNameShort = nameShort;
|
|
15
|
-
|
|
31
|
+
this.makerComment = comment;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
16
34
|
```
|
|
35
|
+
```Java
|
|
36
|
+
public class makerControl extends Application {
|
|
17
37
|
|
|
18
|
-
|
|
38
|
+
// 画面項目
|
|
39
|
+
@FXML
|
|
40
|
+
private TableView<makerModel> tableView;
|
|
41
|
+
@FXML
|
|
42
|
+
public static TableColumn<makerModel, String> fxMakerName;
|
|
43
|
+
@FXML
|
|
44
|
+
public static TableColumn<makerModel, String> fxMakerNameShort;
|
|
45
|
+
@FXML
|
|
46
|
+
public static TableColumn<makerModel, String> fxMakerComment;
|
|
19
47
|
|
|
20
|
-
|
|
48
|
+
public static ObservableList<makerModel> tableMaker = FXCollections.observableArrayList();
|
|
21
49
|
|
|
50
|
+
@Override
|
|
51
|
+
public void start(Stage stage) throws SQLException, ClassNotFoundException {
|
|
52
|
+
try {
|
|
22
|
-
|
|
53
|
+
// FXMLのレイアウトをロード
|
|
54
|
+
AnchorPane root = FXMLLoader.load(getClass().getResource("makerView.fxml"));
|
|
23
55
|
|
|
56
|
+
// シーン生成
|
|
57
|
+
Scene scene = new Scene(root);
|
|
58
|
+
|
|
24
|
-
|
|
59
|
+
// タイトルセット
|
|
60
|
+
stage.setTitle("makerView");
|
|
61
|
+
stage.setScene(scene);
|
|
62
|
+
|
|
63
|
+
showTable(stage);
|
|
64
|
+
|
|
65
|
+
stage.show();
|
|
66
|
+
|
|
67
|
+
} catch (IOException ex) {
|
|
68
|
+
Logger.getLogger(makerControl.class.getName()).log(Level.SEVERE, null, ex);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public void showTable(Stage stage) throws SQLException, ClassNotFoundException {
|
|
73
|
+
|
|
74
|
+
String makerName = "";
|
|
75
|
+
String makerNameShort = "";
|
|
76
|
+
String makerComment = "";
|
|
77
|
+
|
|
78
|
+
makerModel mm = new makerModel();
|
|
79
|
+
|
|
80
|
+
// SQLを実行してList<Object>型で格納する
|
|
81
|
+
List<Object> arrayData = utilDB.executeSelectQuery("SELECT \"makerName\", \"makerNameShort\", \"makerComment\" FROM st_maker");
|
|
82
|
+
|
|
83
|
+
// List型→配列型
|
|
84
|
+
Object[] obj = arrayData.toArray();
|
|
85
|
+
|
|
86
|
+
int rowCount = arrayData.size();
|
|
87
|
+
for (int i = 0; i < rowCount; i++) {
|
|
88
|
+
String[] rowStr = new String[3];
|
|
89
|
+
rowStr = (String[]) obj[i];
|
|
90
|
+
|
|
91
|
+
//一行ずつ読み込む
|
|
92
|
+
for (int col = 0; col < rowStr.length; col++) {
|
|
93
|
+
// nullの場合は空文字に置き換える
|
|
94
|
+
if (null == rowStr[col]) {
|
|
95
|
+
rowStr[col] = "";
|
|
96
|
+
}
|
|
97
|
+
switch (col) {
|
|
98
|
+
case 0:
|
|
99
|
+
System.out.println("MakerName():" + rowStr[col]);
|
|
100
|
+
makerName = rowStr[col];
|
|
101
|
+
break;
|
|
102
|
+
case 1:
|
|
103
|
+
System.out.println("makerNameShort():" + rowStr[col]);
|
|
104
|
+
makerNameShort = rowStr[col];
|
|
105
|
+
break;
|
|
106
|
+
case 2:
|
|
107
|
+
System.out.println("makerComment():" + rowStr[col]);
|
|
108
|
+
makerComment = rowStr[col];
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// 一行ずつObservableListに追加する
|
|
113
|
+
tableMaker.add(new makerModel(makerName, makerNameShort, makerComment));
|
|
114
|
+
}
|
|
115
|
+
// TableViewに一覧をセットする
|
|
116
|
+
tableView.itemsProperty().setValue(tableMaker); // Line 116:ここでエラーが発生
|
|
117
|
+
|
|
118
|
+
fxMakerName.setCellValueFactory(new PropertyValueFactory<makerModel,String>(makerName));
|
|
119
|
+
fxMakerNameShort.setCellValueFactory(new PropertyValueFactory<makerModel,String>(makerNameShort));
|
|
120
|
+
fxMakerComment.setCellValueFactory(new PropertyValueFactory<makerModel,String>(makerComment));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
```Java
|
|
125
|
+
|
|
126
|
+
public static List<Object> executeSelectQuery(String sql) throws SQLException, ClassNotFoundException {
|
|
127
|
+
|
|
128
|
+
// DBに接続する
|
|
129
|
+
connect();
|
|
130
|
+
|
|
131
|
+
// SQLの発行
|
|
132
|
+
resultSet = statement.executeQuery(sql);
|
|
133
|
+
|
|
134
|
+
// 値の取得
|
|
135
|
+
// フィールド一覧を取得
|
|
136
|
+
List<String> resultList = new ArrayList<String>();
|
|
137
|
+
|
|
138
|
+
List<Object> list = new ArrayList<Object>();
|
|
139
|
+
|
|
140
|
+
ResultSetMetaData data = resultSet.getMetaData();
|
|
141
|
+
int colCount = data.getColumnCount();
|
|
142
|
+
for (int i = 1; i <= colCount; i++) {
|
|
143
|
+
resultList.add(data.getColumnName(i));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
//結果の出力
|
|
147
|
+
int rowCount = 0;
|
|
148
|
+
while (resultSet.next()) {
|
|
149
|
+
|
|
150
|
+
String[] ColArray = new String[colCount];
|
|
151
|
+
|
|
152
|
+
int col = 0;
|
|
153
|
+
for (String field : resultList) {
|
|
154
|
+
System.out.println(field + ":" + resultSet.getString(field));
|
|
155
|
+
ColArray[col] = resultSet.getString(field);
|
|
156
|
+
col++;
|
|
157
|
+
}
|
|
158
|
+
list.add(rowCount, ColArray);
|
|
159
|
+
rowCount++;
|
|
160
|
+
}
|
|
161
|
+
// DB切断
|
|
162
|
+
close();
|
|
163
|
+
return list;
|
|
164
|
+
}
|
|
165
|
+
```
|