2011-07-29 37 views
0

我想知道爲什麼一些大型應用程序中的某些JTables有焦點指示器,有些則沒有。要調試這個問題,我添加代碼:爲什麼不是所有的Java Swing JTable都有焦點指示器

UIManager.put("Table.focusCellHighlightBorder",new BorderUIResource(
    new LineBorder(new Color(255,0,0))); 

而那些JTables重點指標變爲紅色,但我還沒有看到所有JTables焦點指示符。任何想法爲什麼JTable中的單元格不顯示焦點指示符?

+1

你是否檢查'null'?另請參閱此[相關,上一個問題](http://stackoverflow.com/questions/6877603/change-the-color-of-the-java-swing-component-focus-indicator/6877841#6877841)。 – trashgod

+0

@trashgod請看我的帖子,基於camickr的例子 – mKorbel

+0

@trashgod我檢查了cellRenderer中的兩個JTable與焦點指示器和一個沒有焦點指示器的邊框,並且都有右邊界= left = top = bottom = 1;我仍然在尋找這兩個JTable之間的不同之處,但目前爲止還沒有成功。 – splatek

回答

1

您需要在創建表之前設置UI屬性「之前」。

如果你仍然有問題,然後張貼您的SSCCE,說明問題,因爲我們無法猜測你在做什麼。

+0

我不是很難,只是因爲我有很少的Java經驗,如果我試圖隔離這段代碼(從幾個類中提取代碼塊)並創建一個SSCCE,那麼不能保證它會有相同的錯誤。我更感興趣的是知道哪些屬性/方法控制着焦點指示器的顯示,這樣我就可以知道在哪裏集中精力去尋找這個bug。也許我只需要自己掙一點時間。如果我確實成功獲得SSCCE或解決方案,我一定會發布它。 – splatek

+0

這就是爲了簡化問題而創建SSCCE的關鍵。通常,當您創建SSCCE時,您會發現代碼正常工作。因此,您需要確定工作代碼和真實代碼的不同之處。您可以通過一次添加一個功能來實現這一點。然後當它停止工作時,你已經隔離了這個問題。現在,您可以修復它,或者如果您不明白爲什麼會導致問題,則可以使用更具體的信息提出問題。 – camickr

+0

感謝您關於SSCCE的提示。我會嘗試將它用於我的下一個問題。 – splatek

1

也許他/她指(添加到您的例子東西......)

public JavaGUI() { 
    CustomModel model = new CustomModel(); 
    JTable table = new JTable(model) { 

     private static final long serialVersionUID = 1L; 
     private Border outside = new MatteBorder(1, 0, 1, 0, Color.red); 
     private Border inside = new EmptyBorder(0, 1, 0, 1); 
     private Border highlight = new CompoundBorder(outside, inside); 

     @Override 
     public Component prepareRenderer(
       TableCellRenderer renderer, int row, int column) { 
      Component c = super.prepareRenderer(renderer, row, column); 
      JComponent jc = (JComponent) c; 
      if (isRowSelected(row)) { 
       jc.setBackground(Color.orange); 
       jc.setBorder(highlight); 
      } else { 
       jc.setBackground(Color.white); 
      } 
      return c; 
     } 
    }; 
    for (int i = 1; i <= 16; i++) { 
     model.addRow(newRow(i)); 
    } 
    this.add(table); 
} 
+0

嗯,我只是把海報的'UIManager.put()'添加到我的[示例]開頭(http://stackoverflow.com/questions/6873665/jtable-row-selection-background-problem/6874437#6874437)例如'display()'方法,正如@camickr所暗示的那樣。 – trashgod

0

兩個JTable中使用的子類DefaultTableCellRenderer並推翻了getTableCellRendererComponent方法的單元格渲染器。顯示焦點指示符的JTable的重寫getTableCellRendererComponent方法,稱爲super.getTableCellRendererComponent方法,但對於未顯示焦點指示符的JTable的重寫getTableCellRendererComponent方法未調用super.getTableCellRendererComponent方法。

JTable的重點指標:

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); 
    .... 

JTable中沒有重點指標:

public Component getTableCellRendererComponent(JTable table, Object value, 
              boolean isSelected, 
              boolean hasFocus, int row, 
              int col) { 
    for (int i = 0; i < ids.length; i++) { 
     .... 
相關問題