我試圖製作一個像Excel一樣工作的表格。這意味着,當用戶開始將數據插入到單元格中時,插入的新數據會選擇並更改其中的內容。開始編輯時選擇所有數據JTable單元格
回答
您可以爲您的表創建一個自定義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;
}
你應該看看extJS。雖然有一個非常陡峭的學習曲線..
我發現ExtJS的Java腳本的工作,這是GPL liscence。我需要至少一個LGPL Liscence。 – 2009-09-11 17:41:37
創建一個自定義編輯器工作正常,如果你永遠只能在表中字符串數據,只需要一個單一的編輯器。但是,如果您有多種不同類型的數據,如字符串,整數,雙精度,貨幣,百分比等,都將JTextField用作編輯器,那麼您需要創建多個自定義編輯器。
您可以在Table Select All Editor上閱讀其他可能的解決方案。
非常感謝您的解決方案適用於我,但我想在編輯後顯示光標,它怎麼可能。它需要點擊後編輯顯示光標。 @Camickr – 2013-03-19 05:02:51
注意,也有另一種可能,則可以覆蓋的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;
}
這根本不起作用 – 2013-04-01 01:03:55
上述解決方案時,通過鼠標點擊開始編輯不起作用。
對於某些人來說,解決方案是調用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;
}
}
如果你的目標是空單元格編輯開始時,沒有必要使用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;
}
};
- 1. 在編輯單元格時按下鍵時,所選JTable編輯不起作用
- 2. 如何在編輯時選擇JTable單元格中的所有文本,而不是在輸入時選擇?
- 3. SWING JTable,單元格開始編輯事件
- 4. Jtable在編輯時不會保存單元格的數據
- 5. 使JTable單元格編輯器值可選,但不可編輯?
- 6. 如何在選擇JRadioButton時設置不可編輯的JTable單元格?
- 7. UITableView在編輯後取消選擇所選單元格
- 8. 無法從JTable可編輯單元格讀取數據
- 9. JTable單元編輯器bug
- 10. 無法編輯JTable單元
- 11. DataGridView - 「單元格選擇樣式」 - 編輯單元格
- 12. 只使用合理的鍵開始在JTable單元格中編輯
- 13. Java JTable多單元格選擇
- 14. 選擇下一個單元格JTable
- 15. 編輯單元格後編輯/更新JTable
- 16. 如何在離開單元格時提交單元格編輯
- 17. 在JTable中編輯單元格時提供額外的行爲
- 18. UITableView編輯時的單元格選擇模式
- 19. 在JCombobox中設置選定的索引作爲單元編輯器在jtable編輯開始
- 20. 在ExtJs 3.4網格的特定單元格中開始編輯
- 21. ExtJS的4.1 - 編輯單元格時消失的選擇(組合框編輯)
- 22. 在編輯單元格值時編輯單元格值時顯示十進制格式的數據
- 23. 轉到單元格編輯模式,並選擇所有單元格文本與VBA
- 24. JTable在點擊時選擇錯誤的單元格
- 25. 按行選擇編輯jtable內容
- 26. Java Swing jtable單元格編輯器使E編號翻倍
- 27. 獲取JTable中所有選定行的單元格值
- 28. 將所有JTable單元格設置爲不可選
- 29. 使JTable中的單元格可編輯 - 單元格的默認值
- 30. 在JTable的prepareRenderer方法中編輯單元格數據是否可行?
非常好的解決方案。謝謝! – 2009-09-11 17:47:43
我不認爲這種解決方案將在所有情況下工作...嘗試在SwingUtilities.invokeLater中包裝selectAll(new Runnable(){public void Run(){textField.selectAll();}});並且不要忘記讓textField最終。 – Jason 2013-01-25 20:14:28