Как принудительно остановить редактирование ячейки в JTable, когда пользователь нажимает на любой другой компонент, чем сама таблица?Force stop редактирование ячейки в JTable по щелчку мыши
попытался это, но он не работает ...
myTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
... или это, что также не работает, как ожидалось
Component co = myTable.getEditorComponent();
if (co != null && !(co instanceof JComboBox)) {
co.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusLost(java.awt.event.FocusEvent evt) {
TableCellEditor tce = myTable.getCellEditor();
if (tce != null) {
tce.stopCellEditing(); // should accept partial edit
}
}
});
}
Имея кнопку с помощью прослушивателя действий прилагается это позволяет принудительно прекратить редактирование любой ячейки в таблице, однако на самом деле это не решение, которое я ищу. Он должен работать, нажимая на любой компонент.
SSCCE
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
public class TableExample {
public static void main(String args[]) {
final Object rowData[][] = { { "1", "one", "not empty" }, { "2", "two", "" }, { "3", "three", "" } };
final String columnNames[] = { "#", "Some Column", "Some Other Column" };
final JTable table = new JTable(rowData, columnNames);
JScrollPane scrollPane = new JScrollPane(table);
table.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
System.out.println("column: "+e.getColumn());
if(1==e.getColumn()){
System.out.println(table.getModel().getValueAt(e.getLastRow(), e.getColumn()));
String value = table.getModel().getValueAt(e.getLastRow(), e.getColumn()).toString();
int rowIndex = e.getLastRow();
if(table.getModel().getValueAt(e.getLastRow(), 2).toString().isEmpty())
table.getModel().setValueAt(value,e.getLastRow(), 2);
}
}
});
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
table.setValueAt("",0,0);
JFrame frame = new JFrame("Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setSize(700, 150);
frame.setVisible(true);
}
}
Свойство term termEditOnFocusLost должно работать. Опубликуйте свой «SSCCE», который демонстрирует проблему. – camickr
'Он должен работать, нажимая на любой компонент.' - в кадре нет компонентов, которые получают фокус при нажатии на них. Что именно ты пытаешься сделать? Вы пытаетесь сохранить данные, когда пользователь нажимает кнопку «Закрыть»? Если это так, используйте WindowListener и обработчик windowClosing() и прекратите редактирование в таблице. – camickr
На самом деле, я просто хочу, чтобы редактирование ячейки прекращалось, когда пользователь щелкает где-то за пределами таблицы. – user955732