Как сделать JTable на cellchange выделить весь текст
Я видел какой-то пример этого, но до сих пор не могу понять и не могу его реализовать.
То, что я хочу сделать, - это изменение ячейки (фокус), в следующей выбранной ячейке будет выделен весь текст, готовый для того, чтобы пользователь полностью изменил его.
Есть идеи как это сделать?
// обновить // каким-то образом мне удалось выпустить следующий класс, но
реализовать это
tblLayers.setDefaultEditor(String.class, new Classes.CellEditor());
ничего не дает, "пока не поддерживается". НЕ брошен..
как мне решить эту проблему?
import java.awt.Component;
import java.util.EventObject;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
public class CellEditor extends JTextField implements TableCellEditor {
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
// final JTextField ec = (JTextField) editorComponent;
//
// ec.setText((String) value);
//
// // selectAll, so that whatever the user types replaces what we just put there
// ec.selectAll();
//
// SwingUtilities.invokeLater(new Runnable() {
//
// public void run() {
// // make the component take the keyboard focus, so the backspace key works
// ec.requestFocus();
//
// SwingUtilities.invokeLater(new Runnable() {
//
// public void run() {
// // at this point the user has typed something into the cell and we
// // want the caret to be AFTER that character, so that the next one
// // comes in on the RHS
// ec.setCaretPosition(ec.getText().length());
// }
// });
// }
// });
// return editorComponent;
throw new UnsupportedOperationException("Not supported yet.");
}
public Object getCellEditorValue() {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean isCellEditable(EventObject anEvent) {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean shouldSelectCell(EventObject anEvent) {
throw new UnsupportedOperationException("Not supported yet.");
}
public boolean stopCellEditing() {
throw new UnsupportedOperationException("Not supported yet.");
}
public void cancelCellEditing() {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addCellEditorListener(CellEditorListener l) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void removeCellEditorListener(CellEditorListener l) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
4 ответа
относительно
editorComponent
где я могу инициализировать эту переменную?
Переменная editorComponent
это поле DefaultCellEditor
,
Вместо
class CellEditor extends JTextField implements TableCellEditor
рассматривать
class CellEditor extends DefaultCellEditor
Тогда вы можете сделать что-то вроде этого:
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
JTextField ec = (JTextField) editorComponent;
if (isSelected) {
ec.selectAll();
}
return editorComponent;
}
Приложение: как предложено @ Edoz и проиллюстрировано в этом полном примере, вы можете выборочно Edoz в очередь selectAll()
когда щелчок мышью инициирует редактирование.
JTable table = new JTable(model) {
@Override // Always selectAll()
public boolean editCellAt(int row, int column, EventObject e) {
boolean result = super.editCellAt(row, column, e);
final Component editor = getEditorComponent();
if (editor == null || !(editor instanceof JTextComponent)) {
return result;
}
if (e instanceof MouseEvent) {
EventQueue.invokeLater(() -> {
((JTextComponent) editor).selectAll();
});
} else {
((JTextComponent) editor).selectAll();
}
return result;
}
};
То, что я хочу сделать, - это изменение ячейки (фокус), в следующей выбранной ячейке будет выделен весь текст, готовый для того, чтобы пользователь полностью изменил его.
Решение зависит от вашего точного требования. JTable имеет рендерер и редактор.
Визуализация обычно просто показывает текст в ячейке. Если вы хотите заменить текст, когда начнете печатать, вам нужно сделать две вещи:
а) измените средство визуализации, чтобы отображать текст в "выбранном" состоянии, чтобы пользователь знал, что ввод символа удалит существующий текст; б) измените редактор, чтобы выбрать весь текст при его вызове
Этот подход является относительно сложным, потому что вам понадобится пользовательское средство визуализации для каждого типа данных в вашей таблице (т. Е. String, Integer).
Или другой подход состоит в том, чтобы автоматически переводить каждую ячейку в режим редактирования, когда она получает фокус, и поэтому вам нужно всего лишь изменить редактор, чтобы выделить текст.
Этот подход прост, как вы можете просто сделать:
JTable table = new JTable(data, columnNames)
{
// 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();
((JTextComponent)editor).selectAll();
}
}
};
Это должно помочь https://forums.oracle.com/forums/thread.jspa?threadID=2317349
вот как я это сделал
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{
public Component getTableCellRendererComponent(JTable table, Object
value, boolean isSelected,boolean hasFocus,int row,int column)
{
super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
if(isSelected)
{
Component editor = table.getEditorComponent();
if (editor instanceof JTextComponent)
{
final JTextComponent jtc = (JTextComponent) editor;
jtc.setCaretPosition(0);
jtc.selectAll();
jtc.getCaret().setSelectionVisible(true);
jtc.getCaret().setVisible(true);
jtc.getCaret().setBlinkRate(1000);
}
}
return this;
}
});