2011-08-12 56 views
4

網上有很多關於如何在swing和JTable中使用超鏈接的討論,例如HyperLink in JTable Cell在JTable單元中,如何正確處理多個超鏈接?

上面的方法是有問題的,因爲它只知道鼠標是哪個單元,而不是確切的文本是對的,這意味着:

  1. 無法處理在同一小區內的多個超鏈接;
  2. 無法使鼠標光標直觀顯示。只要鼠標位於超鏈接的單元格中,即使鼠標指向某些正常文本或甚至是空白區域,鼠標也會變成手形。

另一種方法是在單元格中顯示的JEditorPane,但也存在問題,因爲JTable中僅使用的JComponent返回的單元格渲染畫,我不認爲對象將發送任何事件。由於默認渲染器將爲每個單元重新使用組件,因此處理任何事件都沒有任何意義。

所以我想知道達到上述效果的最好方法是什麼。

+0

另請參見[如何使JTable單元格中的JButton可點擊?](http://stackoverflow.com/questions/5555938/how-to-make-a-jbutton-in-a-jtable-cell -click-able) – Jonas

+0

感謝喬納斯,我沒有時間仔細觀察它,但第一眼看起來似乎我需要一個單元編輯器。似乎它只能處理點擊,對吧?如果我想處理像mouseMove這樣的事件,那麼光標形狀可以正確更改呢?謝謝。 –

回答

3

另一種方法是在單元格中顯示JEditorPane,但也有問題,因爲JTable只使用由單元格渲染器返回的JComponent進行繪製,我不認爲該對象將發送任何事件。

嘗試將單元格置於編輯模式,每次細胞獲得焦點時。然後編輯器應該顯示哪一個是真實的組件,並且它應該重新記錄所有的事件。類似於:

JTable table = new JTable(...) 
{ 
    // Place cell in edit mode when it 'gains focus' 

    public void changeSelection(int row, int column, boolean toggle, boolean extend) 
    { 
     super.changeSelection(row, column, toggle, extend); 

     if (editCellAt(row, column)) 
     { 
      Component editor = getEditorComponent(); 
      editor.requestFocusInWindow(); 
     } 
    } 
}; 

我將自定義代碼以僅編輯特定列的單元格。