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

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

ただいまの
回答率

88.05%

JTableにJCheckBoxを入れる方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,195

score 12

Javaを用いてシステムを作成中です。
その中で、JTableにJCheckBoxを埋め込もうとしている時に疑問点があったので質問させて頂きたいです。

イメージ説明

現在、このようにJCheckBoxを埋め込もうとすると、図のように「class.java.lang.Boolean」と表示されてしまいます。
コードでは「Boolean.class」と指定してセルに値を入れています。
正常にJCheckBoxがJTableの中に表示されない理由を、分かりやすく教えてもらえませんか?

ーーーーーーーーーーーーーーーーーーーーーーー追記------------------------

情報の追加が遅くなり、申し訳ありません。
現在使用しているコードを抜粋してSampleコードを作成したので、至らない点がありましたらお願いします。

【コード】
package view;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Sample extends JFrame {

private DefaultTableModel tableModel;
private JScrollPane scrollPane;
private JTable table;

String[] name = {"フラグ"};

public Sample() {
//タイトル等
setTitle("Sample");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);

//今後、属性を複数増やすためにScrollPane実装
scrollPane = new JScrollPane();
scrollPane.setBounds(20, 170, 150, 80);
add(scrollPane);

//例として属性追加
String[] columnNames = {"フラグ"};
Object[] temp = {Boolean.class};

tableModel = new DefaultTableModel(columnNames, 0);
table = new JTable(tableModel);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

DefaultTableColumnModel columnModel = (DefaultTableColumnModel)table.getColumnModel();
TableColumn column0 = columnModel.getColumn(0);

DefaultTableCellRenderer alignCenter = new DefaultTableCellRenderer();
alignCenter.setHorizontalAlignment(SwingConstants.CENTER);

//セルの大きさ
column0.setPreferredWidth(150);

//行の追加
tableModel.addRow(temp);

scrollPane.setViewportView(table);

//可視化
setVisible(true);
}

public static void main(String[] args) {
//Sampleの実行
new Sample();

}

}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • KSwordOfHaste

    2016/12/24 11:34 編集

    質問をわかりやすくしてください。「コードでは「Boolean.class」と指定してセルに値を入れています。 」ではあなたが実際に何をしているかわかりにくいです。関係すると思われる周辺でよいのでコードを明記しましょう。

    キャンセル

  • travel_saki

    2016/12/24 20:27

    ご指摘ありがとうございます。コードを追加しました。

    キャンセル

回答 1

checkベストアンサー

0

  1. "java.lang.Boolean"と表示された原因
    tableModel.addRow(temp)としていますが、tempの要素がBoolean.classになっています。質問者さんはこれを「1列目のデータ型はBoolean型」と指定したつもりだったかも知れませんが、これはそういう意味のメソッドではなくあくまで新たな行の「データ」を指定するためのものですのでBoolean.classは単なるデータとみなされます。これはClass型のデータですがClass型のカスタムレンダラーはデフォルトでは存在しないので汎用のレンダラーが用いられそれにより単にtoString()で文字列に変換された結果が表示されます。"java.lang.Boolean"と表示されたのはこうした理由です。

  2. 対処法(特定の列をJCheckBoxでレンダリングする方法)
    特定の列の型がBooleanであることをJTableに伝えることでその列の値をJCheckBoxで表示できるようになります。そのためにはTableModelのgetColumnClassメソッドをoverrideしてやればよいです。以下は1列目がBoolean型であるときのコード例です。

tableModel = new DefaultTableModel(columnNames, 0);
==>
tableModel = new DefaultTableModel(columnNames, 0) {
    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0: return Boolean.class;
            default:
                return super.getColumnClass(columnIndex);
        }
    }
};
...
table.addRow(new Object[] { Boolean.false });
table.addRow(new Object[] { false }); // こうも書けます(自動的にBoolean型へboxingされます)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/12/24 22:49

    無事にJTableにJCheckBoxを導入することができました。
    分かりやすく解説とコードまで、ありがとうございました!

    キャンセル

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

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

関連した質問

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