2013-09-26 29 views
2

我想實現一個JTable這也在遵循以下規則:JTextField.selectAll()的作品奇怪

  1. 只有3'rd列的單元格可以編輯。
  2. 當雙擊X行中的任何單元格時,X行的第3列將開始編輯。
  3. 無論何時開始編輯單元格,其中的文本都會被選中。

我有一個擴展JTable的FileTable。在它的構造我有這樣的臺詞:

getColumnModel().getColumn(2).setCellEditor(new FileTableCellEditor()); 

addMouseListener(new MouseAdapter(){ 
     public void mouseClicked(MouseEvent e){ 
      if (e.getClickCount() == 2){ 
       int row = rowAtPoint(e.getPoint()); 
       editCellAt(row, 2); 
      } 
     } 
    }); 

我FileTableCell編輯如下:

public class FileTableCellEditor extends DefaultCellEditor { 

public FileTableCellEditor() { 
    super(new JTextField()); 
} 

@Override 
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
    final JTextField ec = (JTextField) editorComponent;  
    String textValue = (String)value;  
    ec.setText(textValue);  
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      ec.selectAll(); 
     } 
    });  

    return editorComponent; 
} 
} 

我的問題是,當我雙擊單元格這是不是從3'rd專欄中,在第3列上編輯的文本不會突出顯示爲選定的文本。

picture http://www.nispahit.com/stack/tableNotHighlight.png

這是很奇怪的我,因爲我知道文選擇。當我寫東西時,它會刪除之前在該單元格中的文本。它只是沒有選擇什麼。 奇怪的是,當我雙擊3'rd列單元格本身時,它確實突出顯示選擇。

picture http://www.nispahit.com/stack/tableHighlight.png

有人可以倒一些輕?

謝謝!

+0

想要更好的幫助,請嘗試發佈[SSCCE](http://www.sscce.org) – nachokk

+0

第二點不明確,儘管隨着您閱讀更多內容(直到剛剛完成代碼之後),才意識到,實際上應該發生在點編號2 :-) +1的問題。 –

+0

因此,單元格是否被選中似乎有所不同 - 嘗試在開始編輯之前選擇單元格。 – Holger

回答

2

您的JTextField不突出顯示選擇,因爲它沒有集中。只需在ec.selectAll();之後加上ec.requestFocus();即可。然後它按預期工作。

說明:當您單擊可編輯列時,Swing將開始單元編輯(獨立於雙擊偵聽器)並將啓動事件轉發給組件。所以JTextField收到點擊,並會要求重點。當你點擊不同的列時,只有你的MouseListener啓動單元格編輯,並且事件不會被轉發。 (因爲點擊不在文本字段之內,轉發該事件無濟於事。)因此,您必須手動請求焦點。

+0

完美工作!謝謝! – user1028741