0

JTable セル レンダラーを次のように設定するのは奇妙です。

setDefaultRenderer(Object.class, new MyTableRenderer());

私のテーブル レンダラーは次のように動作します。

class MyTableRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value,
                                            isSelected, hasFocus, row, column);
        Font font = comp.getFont();

        if (table.getModel().getValueAt(row, 0).equals(BUY)) {
            comp.setFont(font.deriveFont(Font.BOLD));
            comp.setForeground(BUY_COLOR);
        }
        else {
            comp.setFont(font.deriveFont(Font.BOLD));
            comp.setForeground(SELL_COLOR);
        }
        return comp;
    }
}

しかし、「BigDecimal」タイプの列は適用されませんでした。他の文字列フィールドはすべて正常に機能しています。

次に、もう 1 行追加します。

setDefaultRenderer(BigDecimal.class, new MyTableRenderer());

その後、すべてが正常に機能します。なぜこのようになっているのですか?

4

2 に答える 2

3

デフォルトでは、JTable は Number 型のレンダラーをインストールします。BigDecimal は数値なので、カスタム レンダラーの代わりにデフォルトのレンダラーが使用されます。

ところで: カスタム レンダラーは、潜在的に並べ替え/フィルター処理された行を考慮しないという点でバグがあります (メソッドの行/列インデックス パラメータはビュー座標です)。

@eugener:あなたの答えは間違っています-重要なのはストレージではなく、ルックアップです;-)

乾杯ジャネット

于 2011-03-23T12:43:01.493 に答える
0

のソースコードを見てくださいJTable:

public void setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer) {
  if (renderer != null) {
      defaultRenderersByColumnClass.put(columnClass, renderer);
  } else {
      defaultRenderersByColumnClass.remove(columnClass);
  } 
}

列クラスがキーであるマップを使用し、クラス比較がリテラルであることを意味します。これは、あなたが経験している行動の理由を説明するはずです. これは仕様によるものです。

于 2011-03-22T22:24:34.063 に答える