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

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

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

JTableとは二次元的なセルの表を表示し編集するJava Swing用のコンポーネントです。

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

1346閲覧

JTableの指定カラムのセルを全てコンボボックスにしたい

sait_you

総合スコア6

JTable

JTableとは二次元的なセルの表を表示し編集するJava Swing用のコンポーネントです。

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/04/20 06:11

前提・実現したいこと

タイトルにも記載させて頂きましたが、
データをDBに登録したものをJTableに表示するのは何度かやっていますが、
特定のカラムのセル全てをコンボボックスとして、表示しようとしてもできずに苦戦しています。

発生している問題・エラーメッセージ

結果:1 例外発生:java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?, ?, ?, ?, ?, ?, ? )' at line 1

該当のソースコード

//登録 JButton btnNewButton = new JButton("登録"); btnNewButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自動生成されたメソッド・スタブ Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; try { //空白チェック int errorCode = Validate.ckNull3(textField.getText(), textField_1.getText(), textField_2.getText(), textField_3.getText()); if(errorCode != Validate.getErrCode0()) { //エラーダイアログ表示 JOptionPane.showMessageDialog(frame, Validate.getErrMsg(errorCode)); return; } //文字数チェック if(textField_3.getText().length() != 13) { //エラーダイアログ表示 JOptionPane.showMessageDialog(contentPane, "ISBNは13桁で入力してください。"); return; } //ConboBoxチェック String value = yearsBox.getSelectedItem().toString(); if(value == "-") { //エラーダイアログ表示 JOptionPane.showMessageDialog(contentPane, "発売年を選択してください。"); } //データベースに接続 con = DBconect.getConnection(); pstmt = con.prepareStatement("select COALESCE(max(No), 0) as maxNo from book.tbl_book"); rs = pstmt.executeQuery(); int count = !rs.next() ? 0 : rs.getInt("maxNo"); //SQL文作成 String mySql = "insert into book.tbl_book(No, title, author, publisher, ISBN, releaseday, status)" + "values(?, ?, ?, ?, ?, ?, ? )"; //ステートメントオブジェクトを作成 pstmt = con.prepareStatement(mySql); pstmt.setString(1, String.valueOf(count + 1)); pstmt.setString(2, textField.getText()); pstmt.setString(3, textField_1.getText()); pstmt.setString(4, textField_2.getText()); pstmt.setString(5, textField_3.getText()); pstmt.setString(6, value); pstmt.setString(7, String.valueOf("-")); int num = pstmt.executeUpdate(); System.out.println("結果:" + num + "\t"); String mySql1 = "select No, title, author, punlisher, ISBN, releaseday, status from book.tbl_book order by No"; // SQLの実行; pstmt.executeUpdate(mySql); rs=pstmt.executeQuery(mySql1); //表のヘッダー部を作成 DefaultTableModel tableModel = new DefaultTableModel(columnName, 0); //java.sql.ResultSet の行数を取得するためカーソルを最終行に移動 rs.last(); //結果の行数をセット tableModel.setRowCount(rs.getRow()); //カーソルを先頭行に移動 rs.beforeFirst(); System.out.println("表計算=" + tableModel.getRowCount() + "/t"); int i = 0; //カウントアップ変数 //結果セットからデータを取り出す next() で次の行に移動 while(rs.next()) { //検索結果から表に記載 tableModel.setValueAt(java.lang.String.format("%03d", rs.getInt("No")), i, 0); tableModel.setValueAt(rs.getString("title"), i, 1); tableModel.setValueAt(rs.getString("author"), i, 2); tableModel.setValueAt(rs.getString("publisher"), i, 3); tableModel.setValueAt(rs.getString("ISBN"), i, 4); tableModel.setValueAt(rs.getDate("releaseday"), i, 5); tableModel.setValueAt(rs.getString("status"), i, 6); System.out.println("行数=" + i + "/t"); i++; } //表を描画 frame.getContentPane().add(scrollPane); table.setModel(tableModel); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setColumnSelectionAllowed(false); table.setRowSelectionAllowed(true); table.getColumnModel().getColumn(0).setMinWidth(150); table.getColumnModel().getColumn(1).setPreferredWidth(150); table.getColumnModel().getColumn(1).setMinWidth(1); scrollPane.setViewportView(table); scrollPane.repaint(); //comboの設定 cb = new JComboBox(); cb.setEditable(true); cb.setBorder(BorderFactory.createEmptyBorder()); cb.addItem("-"); cb.addItem("貸出中"); cb.addItem("返却"); //7行目をcomboにする設定。 TableColumnModel tcm = table.getColumnModel(); TableColumn tc = tcm.getColumn(6); //コンボにする行(左から0) tc.setCellEditor(new DefaultCellEditor(cb)); //編集 tc.setCellRenderer(new ComboCellRenderer()); //表示 }catch(Exception ex) { System.out.println("例外発生:" + ex.toString()); JOptionPane.showMessageDialog(frame, "例外発生:" +ex.toString()); }finally { try { //実行結果をクローズ if(rs != null) { rs.close(); } //ステートメントをクローズ if(pstmt != null) { pstmt.close(); } //接続をクローズ if(con != null) { con.close(); } }catch(SQLException se) { //何もしない } } } }); btnNewButton.setBounds(301, 86, 105, 40); contentPane.add(btnNewButton);

試したこと

コードに問題があり、SQL文のinsert文とかみ合っていないことはなんとなくわかるのですが、どこを直せば解決するかがわからずにいます。

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

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

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

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

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

jimbe

2020/04/20 06:53

例外は完全に SQL についてのみですが, コンボボックスと関係するのでしょうか.
guest

回答1

0

ベストアンサー

pstmt.executeUpdate(mySql);

というのが変な所に紛れ込んでいます.

これはこのメソッドが大きすぎて変数のスコープが広くなってしまっていることの弊害と言えます.
このようなことが無いよう処理毎にメソッドに分割する等, 変数のスコープが過度に広くならないようにされるべきかと思います.

また, 例外発生時はメッセージでは無くスタックトレースを表示されれば, 発生個所がどの行なのかが分かります.

#追記
想像して作ってみました. 色々粗削りなままですが...
GitHub Q254994
status コンボボックス

投稿2020/04/20 07:00

編集2020/04/20 16:10
jimbe

総合スコア13209

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

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

sait_you

2020/04/20 22:16

お返事遅くなってしまい申し訳ありません。 また、ありがとうございます! こちらを参考にさせて頂きます。 >これはこのメソッドが大きすぎて変数のスコープが広くなってしまっていることの弊害と言えます. なるほど、、 メソッドの分割まで頭が回っていませんでした、、 ありがとうございます!
jimbe

2020/04/21 04:25 編集

こちらにコードを載せられるかと思って全部一つのファイルに入れてコメントも無くしてましたが, 結局大きすぎで載せられなかったので, 読み難いだけになってしまいました ><
sait_you

2020/04/22 00:00

本当にありがとうございました! とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問