2009-09-11 93 views

回答

3

您可以爲您的表創建一個自定義TableCellEditor。這個類將有一個TextField的實例變量,我們稱之爲textField。然後getTableCellEditorComponent方法看起來是這樣的:

public Component getTableCellEditorComponent(JTable table, Object value, 
          boolean isSelected, int row, int column) { 
    textField.setText(value.toString()); 
    textField.selectAll(); 
    return textField; 
} 
+0

非常好的解決方案。謝謝! – 2009-09-11 17:47:43

+1

我不認爲這種解決方案將在所有情況下工作...嘗試在SwingUtilities.invokeLater中包裝selectAll(new Runnable(){public void Run(){textField.selectAll();}});並且不要忘記讓textField最終。 – Jason 2013-01-25 20:14:28

-1

你應該看看extJS。雖然有一個非常陡峭的學習曲線..

+0

我發現ExtJS的Java腳本的工作,這是GPL liscence。我需要至少一個LGPL Liscence。 – 2009-09-11 17:41:37

2

創建一個自定義編輯器工作正常,如果你永遠只能在表中字符串數據,只需要一個單一的編輯器。但是,如果您有多種不同類型的數據,如字符串,整數,雙精度,貨幣,百分比等,都將JTextField用作編輯器,那麼您需要創建多個自定義編輯器。

您可以在Table Select All Editor上閱讀其他可能的解決方案。

+0

非常感謝您的解決方案適用於我,但我想在編輯後顯示光標,它怎麼可能。它需要點擊後編輯顯示光標。 @Camickr – 2013-03-19 05:02:51

1

注意,也有另一種可能,則可以覆蓋的JTable#prepareEditor類似如下:

@Override 
public Component prepareEditor(TableCellEditor editor, int row, int column) { 
    Component c = super.prepareEditor(editor, row, column); 
    if (c instanceof JTextComponent) { 
     ((JTextComponent) c).selectAll(); 
    } 
    return c; 
} 
+0

這根本不起作用 – 2013-04-01 01:03:55

0

上述解決方案時,通過鼠標點擊開始編輯不起作用。

對於某些人來說,解決方案是調用invokeLater()中的selectAll(),以便在調度鼠標事件後選擇文本,但這不適用於我(可能因爲我使用的是Substance外觀和感覺)後

鞦韆內部獲得的mouseReleased()事件,並再次更改插入符號,如在該堆棧跟蹤:

at javax.swing.text.JTextComponent.fireCaretUpdate(Unknown Source) 
at javax.swing.text.JTextComponent$MutableCaretEvent.fire(Unknown Source) 
at javax.swing.text.JTextComponent$MutableCaretEvent.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at javax.swing.plaf.basic.BasicTableUI$Handler.repostEvent(Unknown Source) 

這裏是我的解決方案: 監聽插入位置更改,並且第一次選擇從所有選擇到在單元編輯開始後沒有選擇,再次調用selectAll()。脫字符偵聽器可以通過自定義單元編輯器進行安裝,如此處所示,或者在自定義JTable中的重寫editCellAt()方法中進行安裝。

private class SelectAllCellEditor extends DefaultCellEditor 
{ 
    public SelectAllCellEditor(JTextField tf) 
    { 
     super(tf); 
    } 

    /** 
    * Flag to ensure we only install the caret listener on the editor once. 
    */ 
    boolean listenerInstalled = false; 
    /** 
    * Primes the caret listener to override deselection when the first mouseReleased() event is reposted to the editor. 
    */ 
    boolean overrideDeselection = false; 

    @Override 
    public Component getTableCellEditorComponent(JTable table , Object value , boolean isSelected , int row , int column) 
    { 
     final JFormattedTextField tf = (JFormattedTextField) super.getTableCellEditorComponent(table , value , isSelected , row , column); 

     if(!listenerInstalled) 
     { 
      tf.addCaretListener(new CaretListener() 
      { 
       int lastDot  = 0; 
       int lastMark = 0; 

       @Override 
       public void caretUpdate(CaretEvent e) 
       { 
        if(overrideDeselection) 
        { 
         int length = tf.getText() == null ? 0 : tf.getText().length(); 

         boolean wasAllSelected = (lastDot == 0 && lastMark == length) || (lastDot == length && lastMark == 0); 
         boolean nowNoneSelected = (e.getDot() == 0 && e.getMark() == 0) || (e.getDot() == length && e.getMark() == length); 

         if(wasAllSelected) 
         { 
          // don't try to override again until the next time cell editing is started 
          overrideDeselection = false; 

          // only re-select all if the selection went to none; otherwise the user clicked the cell and dragged to select part of the text 
          if(nowNoneSelected) 
          { 
           tf.selectAll(); 
          } 
         } 
        } 

        lastDot = e.getDot(); 
        lastMark = e.getMark(); 
       } 
      }); 
      listenerInstalled = true; 
     } 

     // Prime the caret listener to override deselection when the first mouseReleased() event is reposted to the editor. 
     overrideDeselection = true; 
     tf.selectAll(); 
     return tf; 
    } 
} 
0

如果你的目標是空單元格編輯開始時,沒有必要使用selectAll()。只需將值設置爲null

實現的例子:

(首要getTableCellEditorComponent()DefaultCellEditor

TableCellEditor myCellEditor = new DefaultCellEditor(new JTextField()){ 
    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, 
       boolean isSelected, int row, int column) 
    { 
     // empty the cell on edit start 
     delegate.setValue((editorComponent instanceof JTextField)? null : value); 
     return editorComponent; 
    } 
}; 
相關問題