Как выбрать весь текст в ячейке JTable при редактировании
Я хотел бы, чтобы редактор в моих редактируемых JTables выбирал весь текст в ячейке, когда начинал редактировать. Я пробовал пару вещей, которые все вращаются вокруг вызова JTextComponent.selectAll() для компонента, который возвращается из метода TableCellEditor.getTableCellEditorComponent. Ни одна из вещей, которые я пробовал, не срабатывала.
В моей последней попытке я изменил класс SimpleTableDemo из учебника Swing, чтобы использовать собственный TableCellEditor, который вызывает метод selectAll. В отладчике я вижу, что вызывается метод selectAll(), но таблица по-прежнему переходит в режим редактирования, не выбирая текст в ячейке (или, возможно, выбор очищается перед отображением). Этот код приведен ниже. Может ли кто-нибудь сказать мне, где я ошибаюсь?
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.text.JTextComponent;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class SimpleTableDemo extends JPanel {
private boolean DEBUG = false;
public SimpleTableDemo() {
super(new GridLayout(1,0));
String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
Object[][] data = {
{"Kathy", "Smith",
"Snowboarding", new Integer(5), new Boolean(false)},
{"John", "Doe",
"Rowing", new Integer(3), new Boolean(true)},
{"Sue", "Black",
"Knitting", new Integer(2), new Boolean(false)},
{"Jane", "White",
"Speed reading", new Integer(20), new Boolean(true)},
{"Joe", "Brown",
"Pool", new Integer(10), new Boolean(false)}
};
final JTable table = new SelectingTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
if (DEBUG) {
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
printDebugData(table);
}
});
}
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Add the scroll pane to this panel.
add(scrollPane);
}
private void printDebugData(JTable table) {
int numRows = table.getRowCount();
int numCols = table.getColumnCount();
javax.swing.table.TableModel model = table.getModel();
System.out.println("Value of data: ");
for (int i=0; i
Ответы
Ответ 1
Таблица Select All Editor должна работать на вас. Это предпочтительное решение, поэтому вам не нужно создавать собственные редакторы. То есть столбцы, содержащие целые числа, должны принимать только целые числа. С вашим текущим кодом
Ваш код работает частично. Если вы начнете редактирование с помощью клавиши F2, текст будет выбран. Однако, когда вы используете мышь и дважды щелкаете по ячейке, второе событие мыши передается редактору, поэтому каретку можно расположить там, где вы нажали, и это удалит выделение. Решение для этого:
final JTextComponent jtc = (JTextComponent)c;
jtc.requestFocus();
//jtc.selectAll();
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
jtc.selectAll();
}
});
Ответ 2
public class SelectAllCellEditor extends DefaultCellEditor
{
public SelectAllCellEditor(final JTextField textField ) {
super( textField );
textField.addFocusListener( new FocusAdapter()
{
public void focusGained( final FocusEvent e )
{
textField.selectAll();
}
} );
}
}
Ответ 3
JTables может иметь много разных компонентов в ячейке. Обычно вы редактируете JTextField. Сначала вы должны получить поле, а затем выбрать. Вы можете получить длину текста, работая через ваш модальный. Этот код должен начать, вы можете поместить его в обработчик выбора списка. то есть.
ListSelectionModel rowSM = this.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e){
DefaultCellEditor ed = (DefaultCellEditor)this.getCellEditor();
JTextField jf = (JTextField)ed.getComponent();
jf.select(0, *text.length()*);
jf.requestFocusInWindow();
}
});
В частности вам нужно будет найти text.length(). Возможно, что-то вроде:
this.getModel().getValueAt(this.getSelectedRow(), this.getSelectedColumn()).length();
Отказ от ответственности Я не тестировал этот код.