2012-03-19 15 views
0

私は3つの列の列を持つテーブルを持っています。最後の列には緑色の背景と太字のフォントが必要です。だから、カスタムのTableCellRendererが必要だとわかりました。しかしtable.setDefaultRendererと呼ぶと、私のカスタムレンダラーのインスタンスと共にClass columnClassが検索されます。だから私は値String.classを与えた。しかし、レンダリングに使用されることはありません。私はgetTableCellRendererComponentメソッドにブレークポイントを設定しました。ヒットしません。cutsom TableCellRendererを使用してセルの背景を変更する

ここで私は、カスタムレンダラ設定されたコードだ - 私が間違っているのは何

public class TableTest extends JPanel implements ActionListener { 

    MyTableCellRenderer renderer = new MyTableCellRenderer(); 
    MyTableModel model = new MyTableModel(); 
    JTable table = new JTable(); 


    public TableTest() { 
     super(new GridLayout(1,0)); 

     this.setPreferredSize(new Dimension(800, 800)); 

     model.addRow(Arrays.asList("Testing", "Hello world", "Goodbye")); 
     model.addRow(Arrays.asList("Testing", "Hello world", "Goodbye")); 
     table = new JTable(model); 
     table.setDefaultRenderer(String.class, new MyTableCellRenderer()); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(true); 

     //Create the scroll pane and add the table to it. 
     JScrollPane scrollPane = new JScrollPane(table); 

     //Add the scroll pane to this panel. 
     add(scrollPane); 
    } 
} 



public class MyTableCellRenderer extends JLabel implements TableCellRenderer { 

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 

     this.setText(value.toString()); 
     setBackground(Color.GREEN); 
     setText("Test"); 
     return this; 
} 

public class MyTableModel extends AbstractTableModel { 

    private List<String> columnNames = new ArrayList<String>(); 

    private List<List> data = new ArrayList(); 

    { 
     columnNames.add("Test"); 
     columnNames.add("Test"); 
     columnNames.add("Test"); 
    } 

    public void addRow(List<String> rowData) { 
     data.add(rowData); 
     fireTableRowsInserted(data.size() - 1, data.size() - 1); 
    } 

    public int getRowCount() { 
     return data.size(); 
    } 

    public int getColumnCount() { 
     return columnNames.size(); 
    } 

    public Object getValueAt(int rowIndex, int columnIndex) { 
     return data.get(rowIndex).get(columnIndex); 
    } 

} 

は、なぜセルレンダラーが慣れるdoesntの?

注:他のクラスを含めるように投稿を編集しました。

+1

レンダラー – mKorbel

+0

とMyTableModelのコードはどこですか。 – trashgod

+1

MyTableCellRendererのコードも含めると便利だと思います。あなたのMyTableModelは 'getColumnClass'を実装していますか?もしそうなら、それをデバッグしてそれが戻ってくるクラスを発見してください。 – arooaroo

答えて

3

TableModel.getColumnClass(int col)を確認してください。おそらくObject.classを返します。その後、すなわち、Object.classの代わりString.classとレンダラを登録する必要があります。

table.setDefaultRenderer(Object.class, new MyTableCellRenderer()); 
+0

論理的なステップは、Object.classのレンダラーを登録するのではなく、getColumnClassメソッドのString.classを返すようにテーブルモデルを調整することです。 – Robin

2

ためRendererを使用する方法を見つけることができます最後の列には緑色の背景と太字のフォントが必要です。

あなただけの最後の列のカスタムレンダリングをしたい場合は、代わりにtable.setDefaultRenderer()を呼び出して、あなたは(あなたがテーブルの列の固定番号を持っていると仮定)の代わりにこれを使用することができます:

table.getColumnModel().getColumn(table.getColumnCount()-1).setCellRenderer(new MyTableCellRenderer()); 
+0

+1コアの問題を発見した唯一の答え: – kleopatra

1

Iあなた自身がMyTableModelを持って参照してください。あなたのモデルにgetColumnClass()をオーバーロードしましたか?次に、最初の列に文字列が含まれるように指定すると、テーブルで文字列に設定したレンダラーを使用する必要があります。

+0

(および@Max)列クラスはしばしば犯人ですが、OP要件の問題はありません:-) – kleopatra

関連する問題