![](/img/trans.png)
[英]Why doesn't ArrayList.contains(Object.class) work for finding instances types?
[英]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.