4

値に応じて JTable のフィールドの色を変更しようとしています。最初の列の色を変更したくありませんが、とにかくバグのある方法で変更されます(大学やPossible_Reviewerのように一部のフィールドが正しくファイルされていません):x は最初の列です

私のコードは次のとおりです。

table.setDefaultRenderer(Object.class, new CustomRenderer());

private class CustomRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int col){
         Component comp = super.getTableCellRendererComponent(table,  value, isSelected, hasFocus, row, col);
         try {
             Double val =  Double.parseDouble(value.toString());

             if(col == 0){
                 comp.setBackground(Color.white);
             } else {
                 comp.setBackground(changeColor(val));
             }
         } catch (NumberFormatException e){}
         return( comp );
    }

    private Color changeColor(Double val) {
        //returns a Color between red and green depending on val
    }
}

奇妙なことに、「col == 2」を使用すると、2 番目の列が白くなりますが、最初の列は奇妙な色のままです。

誰でもアイデアはありますか?

4

2 に答える 2

3

テーブルの使用方法:カスタムレンダラーの使用では、この代替アプローチについて説明しています。「特定の列のセルでレンダラーを使用するように指定するには、TableColumnメソッドsetCellRenderer()。」

補遺:このアプローチの利点は、ユーザーが列を別の位置にドラッグした場合に、レンダラーが列に「固定」されることです。このsetDefaultRenderer()では、をに置き換えsetCellRenderer()ます。

table.getColumnModel().getColumn(DATE_COL).setCellRenderer(new DateRenderer());
于 2011-08-23T09:13:16.013 に答える
3

JTable クラスを拡張し、このメソッドをオーバーライドする必要があります。

public TableCellRenderer getCellRenderer(int row, int column){}

そうしないと、JTable は同じ列の各セルに同じレンダラーを使用します。

編集:

@Mark Bramnik が指摘したように、getCellRenderer 呼び出しごとに新しい TableCellRenderer オブジェクトをインスタンス化しない方がよいでしょう。次のようなメソッドを実装できます。

setCellRenderer(int row, int col, TableCellRenderer render) 

レンダラーを拡張された JTable 自体に格納します。

于 2011-08-23T08:30:23.663 に答える