2015-03-31 114 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

相关问题