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

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

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

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

Swing

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

Q&A

解決済

1回答

9890閲覧

jtableのクリック時、行取得。

hekomin

総合スコア16

Java

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

Swing

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

0グッド

0クリップ

投稿2016/09/22 23:57

###前提・実現したいこと
swingを使用してjtableからクリックされている行の値を取得したいと考えいます。

actionPerformedを使用し、ボタンが押下されたときにswitch文で、どのボタンが押されたか判定しています。今回は"deletebutton"が押された時にjatableに格納されている値を削除したいと考えています。

選択行のインデックスを取得し、
その行の中のデータ(ID)を元にDBからデータを削除するといった機能となっています。

現在のソースコードで実行した場合、
jtableの行をクリックしても、取得行(rowno)の値が-1となり、行が選択されていません。

###発生している問題・エラーメッセージ
選択行のステータスが-1になっている。
case "deletebutton":

int rowno = table.getSelectedRow(); Object obj = table.getValueAt(rowno, 0); int id = Integer.parseInt(obj.toString());

###試したこと
選択した行を取得できるようにしたい。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のプログラムを動かして試したら、getSelectedRow()が選択された行番号を返却しました。

lang

1import java.awt.BorderLayout; 2import java.awt.Dimension; 3 4import javax.swing.JButton; 5import javax.swing.JFrame; 6import javax.swing.JPanel; 7import javax.swing.JScrollPane; 8import javax.swing.JTable; 9 10public class Test extends JFrame { 11 12 private String[][] tabledata = { { "日本", "3勝", "0敗", "1分" }, { "クロアチア", "3勝", "1敗", "0分" }, 13 { "ブラジル", "1勝", "2敗", "1分" }, { "オーストラリア", "2勝", "2敗", "0分" } }; 14 15 private String[] columnNames = { "COUNTRY", "WIN", "LOST", "EVEN" }; 16 17 public static void main(String[] args) { 18 Test test = new Test("SwingTest"); 19 20 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 test.setVisible(true); 22 } 23 24 Test(String title) { 25 setTitle(title); 26 setBounds(10, 10, 300, 200); 27 28 JTable table = new JTable(tabledata, columnNames); 29 30 JScrollPane sp = new JScrollPane(table); 31 sp.setPreferredSize(new Dimension(250, 70)); 32 33 JPanel p = new JPanel(); 34 p.add(sp); 35 36 getContentPane().add(p, BorderLayout.CENTER); 37 38 // ボタン 39 JButton button = new JButton("test"); 40 getContentPane().add(button, BorderLayout.SOUTH); 41 42 button.addActionListener(event -> { 43 System.out.println(table.getSelectedRow()); 44 }); 45 46 } 47}

getSelectedRow()が常に-1を返却するということは
JTableの設定の問題だと思いますが、なにか設定していませんか?

クリックされている行

これは行の背景色が変わった状態になっていますか?

投稿2016/09/23 00:43

java-beginner

総合スコア452

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

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

hekomin

2016/09/23 01:27

デザイナーを使用し画面を作成しました。 // テーブル table = new JTable(); table.setModel(new DefaultTableModel(new String[][] {,}, table.setRowSelectionAllowed(true); table.setAutoCreateRowSorter(true); new String[] { "ID", "氏名", "フリガナ", "所属部署", "役職" })); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setBounds(12, 147, 613, 224); contentPane.add(scrollPane); tableのソースはこのようになっています。
java-beginner

2016/09/23 01:54

「table.setModel(new DefaultTableModel(new String[][] {,},」 この行はカンマで終わってますが、エラーになってないのでしょうか? 「new String[] { "ID", "氏名", "フリガナ", "所属部署", "役職" }));」 この行は何をしようとしているのでしょうか? あと、気になったのは「table = new JTable();」です。変数tableはどこで定義しているのでしょうか?「int rowno = table.getSelectedRow(); 」のtableでは、上記で生成したインスタンスが格納されてますか?
hekomin

2016/09/23 02:08

>>table.setModel(new DefaultTableModel(new String[][] {,},」 この行はカンマで終わってますが、エラーになってないのでしょうか? この行ではエラーは発生していません。 デバックを行った際にも、動作に影響はありませんでした。 >>「new String[] { "ID", "氏名", "フリガナ", "所属部署", "役職" }));」 この行は何をしようとしているのでしょうか? この行に関しては、jtableの見出しです。 見出しとして、1行テーブルを作成しています。 >>あと、気になったのは「table = new JTable();」です。変数tableはどこで定義しているのでしょうか?「int rowno = table.getSelectedRow(); 」のtableでは、上記で生成したインスタンスが格納されてますか? jtableの定義に関しては、メンバ変数として定義しています。
java-beginner

2016/09/23 02:23

> jtableの定義に関しては、メンバ変数として定義しています。 これなんですが、どこかで違うインスタンスを格納している箇所ありませんか? 例えばなんですが、画面にテーブルが複数あって、「table.getSelectedRow()」は選択のないテーブルについて行番号を取得している・・・など。
hekomin

2016/09/23 02:44

public class GSearch_shain extends JFrame implements ActionListener { // ------------------------------------------------------------------- // メンバ変数 // ------------------------------------------------------------------- private JPanel contentPane; private JFrame errorframe; // 半角エラーダイアログ画面 private JFrame failuredelete;//削除失敗ダイアログ画面 private JFrame successdelete;//削除成功ダイアログ画面 private JTextField namefield; // テキストフィールド private JComboBox comboBox; // コンボボックス private DefaultComboBoxModel model; // コンボボックス private JTable table; // テーブル private JButton searchbutton; // 検索ボタン private JCheckBox department; // 第1開発 private JCheckBox department2; // 第2開発 private JCheckBox department3; // 第3開発 private JCheckBox department4; // 第4開発 private JCheckBox department5; // 第5開発 private JCheckBox department6; // 第6開発 private JCheckBox likeCheckBox; // あいまい検索 private JLabel namelabe; // 氏名 private JButton newregistrationbutton; // 新規登録画面遷移 private JButton changebutton; // 変更画面遷移 private JButton deletebutton; // 削除ボタン private StringBuilder sql; private StringBuilder searchsql; private boolean checkbox; // ------------------------------------------------------------------- public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { GSearch_shain frame = new GSearch_shain(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } // ------------------------------------------------------------------- public GSearch_shain() { //コンストラクタ クラスメイト同じメソッド //デザインメソッド呼び出し design(); // initメソッド呼び出し init(); } // ------------------------------------------------------------------- // 画面デザイン // ------------------------------------------------------------------- public void design() { setTitle("社員情報検索画面"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 653, 419); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JPanel panel = new JPanel(); panel.setBorder(new TitledBorder(null, "\u691C\u7D22\u6761\u4EF6", TitledBorder.LEADING, TitledBorder.TOP, null, null)); panel.setBounds(3, 10, 622, 94); contentPane.add(panel); panel.setLayout(null); // 検索条件 氏名 テキスト namelabe = new JLabel("氏名"); namelabe.setBounds(12, 27, 28, 16); panel.add(namelabe); namefield = new JTextField(); namefield.setBounds(44, 24, 100, 23); panel.add(namefield); namefield.setColumns(10); // 検索条件 役職 コンボボックス 役職マスタから取得 JLabel lblNewLabel_1 = new JLabel("役職"); lblNewLabel_1.setBounds(146, 27, 28, 16); panel.add(lblNewLabel_1); model = new DefaultComboBoxModel(); comboBox = new JComboBox(model); comboBox.setBounds(174, 24, 111, 23); panel.add(comboBox); // comboBox.addActionListener(this); likeCheckBox = new JCheckBox("あいまい検索"); likeCheckBox.setBounds(34, 56, 121, 23); //曖昧検索 初期値 true likeCheckBox.setSelected(true); panel.add(likeCheckBox); // チェックボックス department = new JCheckBox("第1開発課"); department.setBounds(308, 12, 98, 23); panel.add(department); department2 = new JCheckBox("第2開発課"); department2.setBounds(308, 40, 98, 23); panel.add(department2); department3 = new JCheckBox("第3開発課"); department3.setBounds(308, 65, 98, 23); panel.add(department3); department4 = new JCheckBox("第4開発課"); department4.setBounds(408, 12, 91, 23); panel.add(department4); department5 = new JCheckBox("第5開発課"); department5.setBounds(408, 40, 91, 23); panel.add(department5); department6 = new JCheckBox("第6開発課"); department6.setBounds(408, 65, 91, 23); panel.add(department6); // 検索ボタン searchbutton = new JButton("検索"); searchbutton.setBounds(531, 43, 83, 36); panel.add(searchbutton); searchbutton.addActionListener(this); // ボタンにイベントを登録す searchbutton.setActionCommand("searchbutton"); // 画面遷移ボタン newregistrationbutton = new JButton("新規登録"); newregistrationbutton.setBounds(305, 116, 91, 21); contentPane.add(newregistrationbutton); changebutton = new JButton("変更"); changebutton.setBounds(408, 116, 91, 21); changebutton.addActionListener(this); contentPane.add(changebutton); deletebutton = new JButton("削除"); deletebutton.setBounds(511, 116, 91, 21); contentPane.add(deletebutton); deletebutton.addActionListener(this); deletebutton.setActionCommand("deletebutton"); // テーブル table = new JTable(); table.setModel(new DefaultTableModel(new String[][]{}; table.setRowSelectionAllowed(true); new String[] { "ID", "氏名", "フリガナ", "所属部署", "役職" })); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setBounds(12, 147, 613, 224); contentPane.add(scrollPane); // scrollPane.setViewportView(table); }
hekomin

2016/09/23 02:45

// ------------------------------------------------------------------- // 検索ボタンイベント処理 // ------------------------------------------------------------------- // 検索ボタン押下 @Override public void actionPerformed(ActionEvent e) { String url = "jdbc:oracle:thin:@192.168.1.206:1521:XE"; String usr = "UTtraining"; String pass = "pass"; Statement stat = null; Connection conn = null; ResultSet rs = null; sql = null; switch (e.getActionCommand()) { case "searchbutton": // ボタンのクリックイベント // 検索ボタンを押した際のパラメータを元にsqlを実行させる try { conn = DriverManager.getConnection(url, usr, pass); // コネクションスタート // 検索ボタンがクリックされているならばifの中身を実行する。 if (e.getSource() == searchbutton) { // 社員情報テーブル・部署マスタ・役職マスタから以下検索条件を元にSQL実行 // StringBuilderを使用し、appendでsql文を追加していく。 // メリット・検索条件が見やすい、速度が速い。 sql = new StringBuilder(); sql.append(" select "); sql.append(" T_SHAININFO.SHAIN_ID "); sql.append(" ,T_SHAININFO.SHAIN_NAME "); sql.append(" ,T_SHAININFO.SHAIN_KANA "); sql.append(" ,T_SHAININFO.SHAIN_BUSHO_CODE "); sql.append(" ,T_SHAININFO.SHAIN_YAKUSHOKU_CODE "); sql.append(" ,M_BUSHO.BUSHO_NAME "); sql.append(" ,M_YAKUSHOKU.YAKUSHOKU_NAME "); sql.append(" from "); sql.append(" T_SHAININFO "); sql.append(" ,M_BUSHO "); sql.append(" ,M_YAKUSHOKU "); sql.append(" where "); sql.append(" 0 = 0 "); sql.append(" and T_SHAININFO.SHAIN_BUSHO_CODE = M_BUSHO.BUSHO_CODE(+) "); sql.append(" and T_SHAININFO.SHAIN_YAKUSHOKU_CODE = M_YAKUSHOKU.YAKUSHOKU_CODE(+) "); // テキストに値が入力されているか確認する。null以外の場合は半角チェックを行う。 // if(!namefield.getText().equals("")){ // // String str = namefield.getText(); // byte[] bytes = str.getBytes(); // // if (str.length() != bytes.length / 2) { // // // 半角混入 // errorframe(); // } else { // // 全角のみ //テキストボックスに値が入力されているならば以下の処理を実行する。 if (!namefield.getText().equals("")) { //未入力でなければ String str = namefield.getText(); final String MATCH_ZENKAKU = "^[\\u3040-\\u30FF]+$"; //Unicodeを使用し全角のみか判断 if (str.matches(MATCH_ZENKAKU)) { // あいまい検索チェック オン if (likeCheckBox.isSelected()) { sql.append(" AND T_SHAININFO.SHAIN_NAME LIKE '%" + namefield.getText() + "%'"); // あいまい検索チェック オフ } else { sql.append(" AND T_SHAININFO.SHAIN_NAME = '" + namefield.getText() + "'"); } } else { //エラーメッセージ画面表示 errorframe(); } } //チェックボックスが全てオフの場合、SQL文を追加しない if (department.isSelected() || department2.isSelected() || department3.isSelected() || department4.isSelected() || department5.isSelected() || department6.isSelected()) { //チェックボックス↪すべてfalseならばif文を抜ける sql.append(" and T_SHAININFO.SHAIN_BUSHO_CODE "); sql.append(" in "); sql.append(" ( "); checkbox = false; // チェックボックスのステータスがtureならばsql文に追加していく。 if (department.isSelected()) { sql.append(" 1 "); checkbox = true; } if (department2.isSelected()) { if (checkbox == true) { sql.append(" ,2 "); } else { sql.append(" 2 "); checkbox = true; } } if (department3.isSelected()) { if (checkbox == true) { sql.append(" ,3 "); } else { sql.append(" 3 "); checkbox = true; } } if (department4.isSelected()) { if (checkbox == true) { sql.append(" ,4 "); } else { sql.append(" 4 "); checkbox = true; } } if (department5.isSelected()) { if (checkbox == true) { sql.append(" ,5 "); } else { sql.append(" 5 "); checkbox = true; } } if (department6.isSelected()) { if (checkbox == true) { sql.append(" ,6 "); } else { sql.append(" 6 "); checkbox = true; } } sql.append(" ) "); } //コンボボックスのステータスが-1でない場合、選択されている値をSQL文に追加 KeyAndValue itm = null; if (comboBox.getSelectedIndex() == -1) { } else { itm = (KeyAndValue) comboBox.getSelectedItem(); sql.append(" and T_SHAININFO.SHAIN_YAKUSHOKU_CODE = " + itm.getId()); } stat = conn.createStatement(); // ステートメント rs = stat.executeQuery(sql.toString()); // SQL実行 List<GSearch_shainDTO> tableData = new ArrayList<GSearch_shainDTO>(); // tableに表示する項目ID,氏名,カナ,部署名称,役職名称を各listに格納する DefaultTableModel model = (DefaultTableModel) table.getModel(); while (rs.next()) { GSearch_shainDTO dto = new GSearch_shainDTO(); int id = rs.getInt("SHAIN_ID"); String name = rs.getString("SHAIN_NAME"); String kana = rs.getString("SHAIN_KANA"); // 部署コード、役職コード ↪ 部署名、役職名に変更 2016/09/13 String busyo = rs.getString("BUSHO_NAME"); String yakushoku = rs.getString("YAKUSHOKU_NAME"); // 部署コード、役職コード ↪ 部署名、役職名に変更 2016/09/13 model.addRow(new String[] { Integer.toString(id), name, kana, busyo, yakushoku }); table = new JTable(model); //画面に検索結果を反映。 } } } catch (SQLException a) { // TODO 自動生成された catch ブロック a.printStackTrace(); } finally { try { if (rs != null) { rs.close(); // レコードセット 終了 } if (stat != null) { stat.close(); // ステートメント 終了 } if (conn != null) { conn.close(); // コネクション 終了 } } catch (SQLException a) { // TODO 自動生成された catch ブロック a.printStackTrace(); } } break; //削除ボタンがクリックされた場合 case "deletebutton": int rowno = table.getSelectedRow(); Object obj = table.getValueAt(rowno, 0); int id = Integer.parseInt(obj.toString()); sql = new StringBuilder(); sql.append(" delete "); sql.append(" from "); sql.append(" T_SHAININFO "); sql.append(" where "); sql.append(" 0 = 0 "); sql.append(" and T_SHAININFO.SHAIN_ID = " + id); try { conn = DriverManager.getConnection(url, usr, pass); //コネクションスタート stat = conn.prepareStatement(sql.toString()); //ステートメント スタート stat.executeQuery(sql.toString()); //SQL実行 conn.commit(); //コミット successdelete(); //成功ダイアログ } catch (SQLException e1) { try { conn.rollback(); //ロールバック failuredelete(); //失敗ダイアログ } catch (SQLException e2) { // TODO 自動生成された catch ブロック e2.printStackTrace(); } // TODO 自動生成された catch ブロック e1.printStackTrace(); } finally { try { //finallyの作法 if (stat != null) { stat.close(); // ステートメント 終了 } if (conn != null) { conn.close(); // コネクション 終了 } } catch (SQLException a) { // TODO 自動生成された catch ブロック a.printStackTrace(); } } break; default: break; } }
hekomin

2016/09/23 02:45

長くて申し訳ないのですが、これがソースです。先ほどほかに宣言しているところがあるか探しましたが、見つけることができませんでした。
java-beginner

2016/09/23 03:08

検索ボタン押下時の処理に 「table = new JTable(model); //画面に検索結果を反映。」とあります。 なので、画面上のtableとはことなるインスタンスが格納されているようです。 試せてないのですが、table#setModelメソッドだと、削除ボタンで行番号が取得できると思います。
hekomin

2016/09/23 03:54

ご回答ありがとうございます。 申し訳ありません、初心者なもので、回答内容が理解できていません。 大変申し訳ございませんが もう少し噛み砕いて説明していただけると幸いです・・・
java-beginner

2016/09/23 04:00

以下の修正でうまくいきませんか? 「table = new JTable(model); //画面に検索結果を反映。」 ↓ 「table.setModel(model);」
hekomin

2016/09/27 08:28

返信遅くなりまして 申し訳ございません。 無事に解決いたしました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問