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

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

ただいまの
回答率

88.62%

JTableの指定カラムのセルをチェックボックスにしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 474

sait_you

score 6

前提・実現したいこと

ステータスというカラムのセルをチェックボックスで表示したいのですが、上手く表示が出来ずにいます。

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

エラーメッセージは出ていませんが、JTableに表示を行うと最初にゼロが表示され
ステータスカラムのセルをクリックしている間はチェックボックスが表示されますが、話すとtrueまたはfalseが文字列として表示されます。
<表示実行時>
![イメージ説明](d06b21bd50bb77b67aa9637a087fa465.png)
<セル押下後>
イメージ説明

該当のソースコード

package Book;

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class LentHistory extends JFrame {

    private JPanel contentPane;
    private JTextFg LogIDField;
    private JFrame frame;
    private JTable table;
    private String[] columnNames = { "ログインID","ISBN", "タイトル", "作者", "チェック"};
    private DefaultTableModel tableModel;
    private JScrollPane scrollPane = null;
    private JTextField textField;
    private ImageIcon icon;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    LentHistory window = new LentHistory();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public LentHistory() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {

JButton btnNewButton_3 = new JButton("表示");
btnNewButton_3.setBounds(581, 254, 106, 50);

                //表示ボタンのアクション
        btnNewButton_3.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自動生成されたメソッド・スタブ

                Connection con = null;
                PreparedStatement pstmt = null;
                ResultSet rs = null;

                try {
                    //データベースに接続
                    con = DBconect.getConnection();

                    //表示データ存在チェック
                    int errorCode = Validate.ckExistsData(con);
                    if(errorCode != Validate.getErrCode0()) {
                        //エラーダイアログ表示
                        JOptionPane.showMessageDialog(frame, Validate.getErrMsg(errorCode));
                        return;
                    }

                    //SQL文作成
                    String mySql = "select * from book.tbl_history";
                    //ステートメントオブジェクトを作成
                    pstmt = con.prepareStatement(mySql);
                    //検索するSQL実行
                    rs = pstmt.executeQuery();

                    //表のヘッダー部を作成
                    tableModel = new DefaultTableModel(columnNames, 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(rs.getString("LogID"), i, 0);
                        tableModel.setValueAt(rs.getString("ISBN"), i, 1);
                        tableModel.setValueAt(rs.getString("title"), i, 2);
                        tableModel.setValueAt(rs.getString("author"), i, 3);
                        tableModel.setValueAt(rs.getObject("gtya_date"), i, 4);
                        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.getIgnoreRepaint();

                    //チェックボックス
                    JCheckBox cb = new JCheckBox();
                    cb.setSelected(false);
                    TableColumn cbColumn = table.getColumnModel().getColumn(4);
                    cbColumn.setCellEditor(new DefaultCellEditor(cb));


                }catch(Exception ex) {
                    System.out.println("例外発生:" + ex.toString());
                }finally {
                    try {
                        //実行結果をクローズ
                        if(rs != null) {
                            rs.close();
                        }
                        //ステートメントをクローズ
                        if(pstmt != null) {
                            pstmt.close();
                        }
                        //接続をクローズ
                        if(con != null) {
                            con.close();
                        }
                    }catch(SQLException se) {
                        //何もしない
                    }
                }

            }

        });
        frame.getContentPane().setLayout(null);
        frame.getContentPane().add(btnNewButton_3);
}
}

補足情報(FW/ツールのバージョンなど)

以下にSQL文を記載いたします。

CREATE TABLE book.tbl_history
(
    LogID                       CHAR(8) NOT NULL,
    ISBN                        CHAR(13) NOT NULL,
    title                       VARCHAR(20) NOT NULL,
    author                      VARCHAR(20) NOT NULL,
    gtya_date                   CHAR(5) NOT NULL
);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

以下のサイトを参考にコードを組み立て完了しました。
https://www.thaicreate.com/java/java-gui-example-jtable-checkbox.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る