[英]How to select all text in JTable cell when editing but not when typing?
JTable的默認行為是在您開始鍵入時附加到內容,並在單擊時將插入符號放在單擊的位置。 我希望這兩件事的行為都能改變,因此當我編輯單元格時,通過鍵入或單擊然后鍵入來替換內容。 然而,當我單擊一個單元格然后更改插入位置時,我希望內容保留,以便我可以更改它。
我知道如何在單元格編輯時選擇所有內容,方法是將單元格編輯器替換為選擇SwingUtilities.invokeLater內部的單元格編輯器(參見其他地方 ),但這會導致鍵入行為中斷。 當我這樣做並開始鍵入單元格時,首先將鍵入的字符附加到字符串,然后選擇它(但選擇是不可見的!),當鍵入另一個字符時,內容將被替換。
有沒有辦法在鍵入高亮(但不是編輯)單元格時立即替換內容,但在單擊單元格時選擇全部?
這是我用於CellEditor的代碼:
public class TextFieldCellEditor extends JTextField implements TableCellEditor
{
private CellEditorListener cellEditorListener = null;
private boolean isInteger = false;
private Object oldValue;
// Start editing
@Override
public Component getTableCellEditorComponent(JTable table, Object obj, boolean isSelected, int row, int column)
{
Color color2 = DefaultLookup.getColor(this, ui, "Table.alternateRowColor");
super.setBackground(color2 != null && (row & 1) == 1? color2 : table.getBackground());
super.setForeground(table.getForeground());
super.setBorder(DefaultLookup.getBorder(this, ui, "Table.focusCellHighlightBorder"));
super.setText(obj.toString());
isInteger = obj instanceof Integer;
if (isInteger)
{
super.setHorizontalAlignment(SwingConstants.RIGHT);
oldValue = obj;
}
// SwingUtilities.invokeLater(new Runnable()
// {
// public void run()
// {
// TextFieldCellEditor.this.selectAll();
// }
// });
return this;
}
// Retrieve e dited value
@Override
public Object getCellEditorValue()
{
if (isInteger)
{
// Try to convert to integer. If input is invalid, revert.
try
{
return new Integer(super.getText());
}
catch (NumberFormatException e)
{
return oldValue;
}
}
return super.getText();
}
@Override
public boolean isCellEditable(EventObject e)
{
return true;
}
@Override
public boolean shouldSelectCell(EventObject e)
{
return true;
}
@Override
public boolean stopCellEditing()
{
cellEditorListener.editingStopped(new ChangeEvent(this));
return true;
}
@Override
public void cancelCellEditing()
{
cellEditorListener.editingCanceled(new ChangeEvent(this));
}
@Override
public void addCellEditorListener(CellEditorListener celleditorlistener)
{
cellEditorListener = celleditorlistener;
}
@Override
public void removeCellEditorListener(CellEditorListener celleditorlistener)
{
if (cellEditorListener == cellEditorListener) cellEditorListener = null;
}
}
在getTableCellEditorComponent()
實現中,添加以下內容:
if (isSelected) {
this.selectAll();
}
DefaultCellEditor(JTextField textField)
,為什么不擴展AbstractCellEditor
或DefaultCellEditor(JTextField textField)
? 另請參見如何使用表:使用其他編輯器 。
我能找到的最簡潔的解決方案是覆蓋JTable的editCellAt並告知CellEditor如何觸發編輯:
@Override
public boolean editCellAt(int row, int column, EventObject e) {
cellEditor.setKeyTriggered(e instanceof KeyEvent);
return super.editCellAt(row, column, e);
}
這是相關的CellEditor代碼:
public class MyCellEditor extends DefaultCellEditor {
private boolean keyTriggered;
public MyCellEditor() {
super(new JTextField());
final JTextField textField = (JTextField) getComponent();
textField.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (!keyTriggered) {
textField.selectAll();
}
}
});
}
});
}
public void setKeyTriggered(boolean keyTriggered) {
this.keyTriggered = keyTriggered;
}
@Override
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column) {
final JTextField textField = (JTextField)
super.getTableCellEditorComponent(table, value, isSelected, row, column);
textField.selectAll();
return textField;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.