2016-09-28 74 views
0

我在JTable中有表格。 2個字符串和一個Integer。我試圖渲染(僅整數列)單元格值是否爲0 <有我的代碼:渲染具有值的單元格

public Component getTableCellRendererComponent(JTable aTable, Object aNumberValue, 
               boolean aIsSelected, boolean aHasFocus, int aRow, int aColumn) { 

    if (aNumberValue == null) { 
     return this; 
    } 
    Component renderer = super.getTableCellRendererComponent(
      aTable, aNumberValue, aIsSelected, aHasFocus, aRow, aColumn 
    ); 

    Number value = (Number) aNumberValue; 
    if (value.doubleValue() < 0) { 
     // do something with renderer 
    } else { 
     // do something with renderer 
    } 
    return this; 
} 

的問題是:我認爲,該代碼嘗試檢查所有細胞與字符串列,因爲我有錯誤:該行中的java.lang.String cannot be cast to java.lang.NumberNumber value = (Number) aNumberValue;。你能告訴我如何限制檢查只有一列(ID = 1)?

編輯編輯編輯

好吧,我發現如何限制我的渲染。現在我有代碼:

class TableRendererExample extends DefaultTableCellRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     int i = (int) value; 
     System.out.println(value); 
     c.setForeground(Color.GREEN); 
     return c; 
    } 
} 

我的問題是...爲什麼當我嘗試打印值是工作,但是當我嘗試投對象(值)整數i有例外:java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer。當我打印時,只有值,但問題在於投射...

回答

0

您可以根據您獲取的列索引作爲參數進行委託。

從概念上講,它應該工作如下

public Component getTableCellRendererComponent(JTable aTable, Object aNumberValue, 
               boolean aIsSelected, boolean aHasFocus, int aRow, int aColumn) { 

    if (aColumn != MY_INTEGER_COLUMN_INDEX) 
     // Use the default cell renderer component for 
     // any column except for the Integer column 
     return super.getTableCellRendererComponent(
      aTable, aNumberValue, aIsSelected, aHasFocus, aRow, aColumn 
     ); 

    // special handling for the Integer column 

    if (aNumberValue == null) { 
     return this; 
    } 

    Number value = (Number) aNumberValue; 
    if (value.doubleValue() < 0) { 
     // do something with renderer 
    } else { 
     // do something with renderer 
    } 
    return this; 
} 

關於你的編輯,我只能重申carmickr's answer

    當然
  • ,如果你想投你該列的對象到Integer,您必須確保表模型實際上返回整數值。默認情況下,DefaultTableModel僅返回字符串,因爲這些是用戶可以鍵入的值
  • 閱讀tutorial和JTable文檔。定製JTable中是非常複雜的,所以你一定要了解如何JTable的作品,模特是如何關聯等
+0

好的,但當它不是myIntegerColumn,如果renderer對象,我想改變呢? –

+0

「問題是你必須爲整個表定義一個TableCellRenderer。」[不,你沒有。](http://docs.oracle.com/javase/8/docs/api/javax/swing /table/TableColumn.html#setCellRenderer-javax.swing.table.TableCellRenderer-) – VGR

+0

好的,那麼你能告訴我應該使用什麼來修復它只有一列? –

2

要將渲染器添加到特定的列在表中的代碼應該是這樣的:

table.getColumnModel().getColumn(0).setCellRenderer(customRenderer); 

I'm trying to render (only integer column) cell if value is < 0.

創建自定義渲染器,最簡單的方法就是做修改顯示的值:

class MyRenderer extends DefaultTableCellRenderer 
{ 
    public MyRenderer 
    { 
     setHorizontalAlignment(JLabel.RIGHT); 
    } 

    @Override 
    public setValue(Object value) 
    { 
     Number number = (Number)value; 

     if (number >= 0) 
      number = null; 

     super.setValue(value); 
    } 
} 

呦您還需要覆蓋TableModel的isCellEditable(...)方法或JTable返回Integer.class,並且必須將Integer值存儲在TableModel中。

閱讀Swing教程How to Use Tables中的部分。 TableToolTipsDemo有一個具有不同數據類型的表的例子。

+0

編輯過的第一篇文章,你能看看這個嗎? –

+0

@ J.Carrer,參見編輯。 – camickr