2015-03-31 116 views
0

以下是我的代碼片段:在JTable的prepareRenderer方法中編輯單元格數據是否可行?

公共GUI(){ ...

deadlinesAndTimeTasksTable = new JTable(deadlinesAndTimeTasksModel) { 
     public Component prepareRenderer(TableCellRenderer renderer, int row, int column) 
     { 
      Component c = super.prepareRenderer(renderer, row, column); 

      String dateTime; 
      String deadline = (String) deadlinesAndTimeTasksTable.getValueAt(row, 4); 
      if (!deadline.equals("- -")) { 
       dateTime = deadline; 
      } else { 
       dateTime = (String) deadlinesAndTimeTasksTable.getValueAt(row, 3); 
      } 


      DateParser dp = new DateParser(dateTime); 



      if (dp.getDateTimeInMilliseconds() < System.currentTimeMillis()) { 
       String description = (String) deadlinesAndTimeTasksTable.getValueAt(row, 1) + "!!"; 
       setValueAt(description, row, 1) 
       c.setForeground(Color.RED); 

      } else { 
       c.setForeground(Color.BLUE); 
      } 

      String status = (String) deadlinesAndTimeTasksTable.getValueAt(row, 5); 

      if (status.equals("undone")) { 

       c.setBackground(new Color(0,0,0,0)); 
       c.setFont(new Font("Arial", Font.BOLD, 12)); 
      } else { 
       c.setBackground(new Color(0,180,150,30)); 


      } 




      return c; 
     } 

    }; 

... 
} 

我想要做的就是追加一個字符,說「!」如果任務的時間早於當前時間,那麼我的一個單元正在存儲任務的描述。但是,如果我使用setValueAt(description +「!!」,row,1)(1是存儲描述的列),會發生什麼情況是此方法會一直被重複調用,並且「!!」不斷追加,使我有「!!!!! ........」,導致我的程序最終崩潰。

我可以知道是什麼原因導致問題以及我如何解決問題?

另一個問題是,prepareRenderer只能用於更改數據的格式,以至於編輯prepareRenderer中的單元格數據不可取?

回答

1

但是,如果我用setValueAt ...

不要使用setValueAt(...),這將更新的TableModel,你已經注意到了。

的默認渲染器是一個JLabel因此,你可以這樣做:

JLabel label = (JLabel)c; 
label.setText(...); 

這隻會影響到當前的渲染,沒有的TableModel。

prepareRenderer只能用來更改數據

的格式通常你會使用自定義渲染器對數據進行格式化。這是如何將值「123456789」的整數格式化爲「123,456,789」或將日期格式化爲YYYY-MM-DD的方式。

我使用prepare renderer方法的唯一時間是行級突出顯示。有關更多信息,請參閱Table Row Renderering

相關問題