2012-02-22 86 views
3

我寫了一個默認的表如下方式呈現:刷新JTable的時候setAutoCreateRowSorter是真的

public class CustTableRenderer extends DefaultTableCellRenderer{ 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { 
     Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); 
     try { 

      Object cellObj = table.getModel().getValueAt(row, 7); 
      double cellValue = (Double) cellObj; 

      if (cellValue < 0) { 
       comp.setBackground(new Color(255, 48, 48)); 
      } else if (cellValue == 0) { 
       comp.setBackground(new Color(173, 255, 47)); 
      } else { 
       comp.setBackground(Color.white); 
      } 

      if (isSelected) { 
       comp.setBackground(new Color(71, 60, 139)); 
       TableModel model = table.getModel(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return comp; 
    } 
} 

爲了突出其包含零下7列的值,我還設置setAutoCreateRowSortertrue行。我的問題是,當我點擊一個標題按照它進行排序時,表格被排序但突出顯示的行沒有改變,因此突出顯示了錯誤的行。

如何在排序時重繪表格?

+1

附上/docs/api/javax/swing/event/RowSorterListener.html添加到表中,並在委託方法中調用表的doLayout。 – govi 2012-02-22 10:24:51

+0

@govi - 不,手動doLayout是_never_需要的。如果這似乎解決了一個問題,其他地方有什麼不對勁 – kleopatra 2012-02-22 10:27:51

+0

@kleopatra - 嗯。好吧,這是真的。 – govi 2012-02-22 10:36:59

回答

7

傳遞到渲染器的座標在視圖座標系中,你必須將它們轉換爲模型座標之前訪問模型:http://docs.oracle.com/javase/6

int modelRow = table.convertRowIndexToModel(row); 
    int modelColumn = table.convertColumnIndexToModel(column); 
    cellObject = table.getModel().getValueAt(modelRow, modelColumn); 
+0

:@ Keleopatra->非常感謝 – Harsha 2012-02-22 10:36:16