質問: 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(); } }
回答: 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されます) ```