簡體   English   中英

當我設置Object.class時,JTable DefaultCellRenderer不適用於BigDecimal類型

[英]JTable DefaultCellRenderer doesn't work on BigDecimal Type when I set Object.class

我像這樣設置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”的列,其他字符串字段都可以正常工作。

然后,我再添加一行:

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

然后一切都很好。 為什么會這樣呢?

JTable默認情況下為Number類型安裝一個渲染器。 BigDecimal是一個數字,因此使用默認渲染器而不是自定義渲染器。

順便說一句:您的自定義渲染器有很多錯誤,因為它沒有考慮可能經過排序/篩選的行(該方法的行/列索引參數是視圖坐標)。

@eugener:您的答案是錯誤的-重要的不是存儲,而是查找;-)

干杯珍妮特

看一下JTable的源代碼:

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

它使用一個以列類為鍵的映射,這意味着類比較是文字。 這應該可以解釋您遇到的行為的原因。 這是設計使然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM