Bei einer JTable
zeige ich auf Klick in eine Zeile einen detailierteren Dialog an. Das klappt soweit auch gut. Die Tabelle wurde mit
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
erstellt. Wenn ich nach Beendigung des Dialogs “wieder zurück” bin, versuche ich die Selektion in der Tabelle zu entfernen mit:
table.clearSelection();
Die schwarze Selektion der Zeile verschwindet auch, leider wird, wenn die Tabelle den Fokus wieder erhält, nachdem der andere Dialog weg ist, ein blauer kleiner Rahmen um die Zelle gezeichnet, in die ich geklickt habe.
Ich habe auch schon versucht, mit der Hilfklasse
[code]import java.awt.Component;
import java.awt.Container;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.DefaultCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellEditor;
public class CellFocusLoosingTable extends JTable {
private static final long serialVersionUID = 1L;
public CellFocusLoosingTable() {
addLoosingCellEditor();
addLoosingFocusListener();
}
private void addLoosingCellEditor() {
JTextField editorField = createCellEditorField();
DefaultCellEditor editor = new DefaultCellEditor(editorField);
setDefaultEditor(Object.class, editor);
}
private JTextField createCellEditorField() {
JTextField editorField = new JTextField(10);
editorField.setBorder(new EmptyBorder(1, 1, 1, 1));
editorField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent event) {
editorFocusLost(event);
}
});
return editorField;
}
private void editorFocusLost(FocusEvent event) {
TableCellEditor cellEditor = getCellEditor();
if (cellEditor != null) {
if (!cellEditor.stopCellEditing()) {
cellEditor.cancelCellEditing();
}
}
Component gotFocus = event.getOppositeComponent();
if (!this.equals(gotFocus)) {
clearSelection();
}
}
private void addLoosingFocusListener() {
addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent event) {
tableFocusLost(event);
}
@Override
public void focusGained(FocusEvent event) {
// nix
}
});
}
private void tableFocusLost(FocusEvent event) {
// getSelectionModel().clearSelection(); Auch nicht.
//
Component gotFocus = event.getOppositeComponent();
if (gotFocus != null) {
Container parent = gotFocus.getParent();
if (parent != null) {
if (!parent.equals(this)) {
TableCellEditor cellEditor = getCellEditor();
if (cellEditor != null) {
if (!cellEditor.stopCellEditing()) {
cellEditor.cancelCellEditing();
}
}
clearSelection();
}
}
}
}
}[/code]
zu arbeiten, vergeblich.
Ich habe auch schon viel gegoogelt, es finden sich zahlreiche Beispiele:
- http://stackoverflow.com/questions/9234322/how-to-clear-table-selection-when-clicking-on-right-of-table
- http://stackoverflow.com/questions/31979925/lose-selection-of-a-jtable-cell
- http://forums.codeguru.com/showthread.php?301102-JTable-cell-remains-selected-even-after
Das klappt auch immer ganz wunderbar, wenn man den Focus woanders hat. Aber mein Problem ist, dass die Tabelle den Focus ja zurückerhält.
Ich habe auch schon versucht, einen FocusListener
zu verwenden, der bei focusGained()
reagiert, ohne Erfolg.
Bevor ich jetzt ein KSKB bastel, wollte ich hören, ob das Problem nicht schon eh jemandem bekannt ist. Sonst mach ich das gern, falls jemand mitbasteln möchte.