- - PR -
DefaultTableCellRendererの使い方
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-07 20:23
はじめて、書きこみします。
テーブルセルの背景色をgetTableCellRendererComponentメソッドを使って 制御しています。使い方が悪いのか、なぜがテーブルの行選択ができなくなってしまいました。 下記の私がコーディングしたものを簡略化したサンプルを記載しました。 どこが悪いのかご指摘ください。お願いします。 import javax.swing.*; import javax.swing.event.*; import java.awt.*; import javax.swing.table.*; public class Test1 extends JFrame { static final int FRAMESIZE_W = 1000; static final int FRAMESIZE_H = 600; static final int BTNSIZE_W = 100; static final int BTNSIZE_H = 40; String[][] rowData = { {"愛知","500","400","700","200"}, {"岐阜","300","100","150","250"}, {"三重","400","400","400","400"}, {"静岡","300","450","200","550"}, }; MyCellRenderer myren; TableModel model; JTable table1; public static void main(String[] args){ Test1 test = new Test1(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } Test1(){ setTitle("行選択テスト"); setSize( FRAMESIZE_W,FRAMESIZE_H); BorderLayout bl = new BorderLayout(); JPanel panel1 = new JPanel(bl); model = new MyTableModel(); table1 = new JTable(model); JScrollPane scrPane = new JScrollPane(); scrPane.getViewport().setView(table1); scrPane.setPreferredSize(new Dimension(200, 100)); panel1.add(scrPane, BorderLayout.CENTER); getContentPane().add(panel1); myren = new MyCellRenderer(); table1.setDefaultRenderer(Object.class, myren); //この行をコメントにすると行選択できます。 table1.setRowSelectionAllowed(true); } class MyCellRenderer extends DefaultTableCellRenderer { private int intRowNum; public void setRowNum(int localRowNum){ intRowNum = localRowNum; } public Component getTableCellRendererComponent( JTable table, Object data, boolean isSelected, boolean hasFocus, int row, int column) { setOpaque(true); setBackground(Color.YELLOW); setText((String)data); return this; } } class MyTableModel extends AbstractTableModel{ public int getColumnCount(){ return rowData[0].length; } public int getRowCount(){ return rowData.length; } public Object getValueAt(int row, int col){ return rowData[row][col]; } } } | ||||||||
|
投稿日時: 2005-05-07 20:50
使い方を間違っています。
デザインパターンとか、オブジェクト指向をきちんと理解していないと思われます。 セルレンダラはあくまでレンダラーです。 アプリケーションがセルをレンダリング使用とするときに使われるものです。 x行目y桁目のセルを描画しようと思うんだけど、どう描画したらいい? と聞かれて、あなたは(どのセルであろうと)背景色を黄色にしてね。しかも上書きで。と設定してます。 | ||||||||
|
投稿日時: 2005-05-07 20:55
getTableCellRendererComponentの中で、isSelectedを元に選択or非選択の処理を分けましょう。
[余談] 下記の様に書くとソースがインデントされて表示されます。 [code] ソース [/code] [ メッセージ編集済み 編集者: ぽん 編集日時 2005-05-07 20:57 ] | ||||||||
|
投稿日時: 2005-05-07 21:05
こんばんは。
このサンプルは簡単に書いたもので実際は、 もうすこし複雑です。 一番知りたいのは、getTableCellRendererComponentを使った場合に、 テーブルの行選択できなくなることです。 パラメータの JTable table, Object data, boolean isSelected, boolean hasFocus, int row, int column の設定で行選択ができるようになるのでしょうか? | ||||||||
|
投稿日時: 2005-05-07 21:21
「行選択できなくなる」というのは どのような現象によって確認したのですか? 選択行の色が変わらないから行選択されていないと思い込んでいるだけじゃないですか? 黄色のままでも行選択されているとは考えないのですか? で、isSelected == true のときは黄色で塗らない、というのは試しましたか? | ||||||||
|
投稿日時: 2005-05-07 21:25
| ||||||||
|
投稿日時: 2005-05-07 21:26
>で、isSelected == true のときは黄色で塗らない、というのは試しましたか?
まさにそのとおりでした。 思い込みでした。 まだまだ勉強不足でご迷惑をお掛けしました。 ありがとうございました。 |
1