Hallo Forum,
ich kann in meiner Tabelle Änderungen nicht wie gewohnt mit der ENTER- bzw. RETURN-Taste übernehmen. Ich vermute, es liegt an meinem CellEditor. Denn solange ich keinen eigenen Editor zufüge, zeigt sich das gewünschte Verhalten: ENTER übernimmt den Eintrag und übergibt den Fokus an die Zelle in der darunterliegenden Tabellenreihe.
Wenn ich einen eigenen CellEditor hinzufüge, hat die ENTER-Taste keine Wirkung mehr. Ich muss den Fokus entweder durch die TAB- oder Pfeiltasten oder per Mausklick auf eine andere Zelle bringen, damit die Eingabe übernommen wird.
Mache ich etwas falsch oder muss ich die Funktion der ENTER-Taste bei eigenem CellEditor selbst implementieren?
Hier mal mein Editor (der vermutlich noch Unzulänglichkeiten enthält, aber für's erste ansonsten gut funktioniert):
ich kann in meiner Tabelle Änderungen nicht wie gewohnt mit der ENTER- bzw. RETURN-Taste übernehmen. Ich vermute, es liegt an meinem CellEditor. Denn solange ich keinen eigenen Editor zufüge, zeigt sich das gewünschte Verhalten: ENTER übernimmt den Eintrag und übergibt den Fokus an die Zelle in der darunterliegenden Tabellenreihe.
Wenn ich einen eigenen CellEditor hinzufüge, hat die ENTER-Taste keine Wirkung mehr. Ich muss den Fokus entweder durch die TAB- oder Pfeiltasten oder per Mausklick auf eine andere Zelle bringen, damit die Eingabe übernommen wird.
Mache ich etwas falsch oder muss ich die Funktion der ENTER-Taste bei eigenem CellEditor selbst implementieren?
Hier mal mein Editor (der vermutlich noch Unzulänglichkeiten enthält, aber für's erste ansonsten gut funktioniert):
Java:
import javax.swing.table.TableCellEditor;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.util.EventObject;
import javax.swing.text.MaskFormatter;
import java.lang.String.*;
import javax.swing.*;
import javax.swing.InputVerifier;
import javax.swing.text.JTextComponent;
import javax.swing.JComponent;
public class MyCellEditor extends AbstractCellEditor implements TableCellEditor {
JFormattedTextField ftf;
MaskFormatter formatter;
public MyCellEditor(String maske, String erlaubt, String platzhalter, Double min, Double max) {
if (maske.equals("") == false) {
try {
formatter = new MaskFormatter(maske); // Formatmaske
if (erlaubt.equals("") == false) {
formatter.setValidCharacters(erlaubt); // Gueltige Zeichen
}
if (platzhalter.equals("") == false) {
formatter.setPlaceholder(platzhalter); // Platzhalter
}
ftf = new JFormattedTextField(formatter);
} catch (Exception e) {
}
} else {
ftf = new JFormattedTextField(); // wenn keine Formatter-Informationen uebergeben werden
}
ftf.setInputVerifier(new MyInputVerifier(min, max));
}
// Zelle schon nach einfachem Klick editierbar
@Override
public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
return ((MouseEvent) anEvent).getClickCount() >= 1;
}
return true;
}
public Object getCellEditorValue() {
return ftf.getText().trim(); // eingebener Wert wird übernommen
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
String stringValue = (String) value;
try {
stringValue.trim();
} catch (Exception e) {
}
ftf.setText((stringValue).trim());
return ftf;
}
// Focuswechsel verhindern bei ungueltiger Eingabe
@Override
public boolean stopCellEditing() {
if (ftf.getInputVerifier().shouldYieldFocus(ftf) == true) {
fireEditingStopped();
return true;
} else {
return false;
}
}
}
// Eingabepruefung
class MyInputVerifier extends InputVerifier {
private Object min, max;
public MyInputVerifier(Object dmin, Object dmax) {
min = dmin;
max = dmax;
}
public boolean verify(JComponent input) {
if (!(input instanceof JTextComponent)) {
return false;
}
if (min==null & max==null){
return true;
}
JTextComponent comp = (JTextComponent) input;
Double val = null;
try {
val = Double.parseDouble(comp.getText().trim());
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(null, "NumberFormatException in Inputverifier!", "Hinweis", JOptionPane.INFORMATION_MESSAGE);
}
Boolean gueltig = (val >= (Double) min && val <= (Double) max);
if (gueltig == false) {
JOptionPane.showMessageDialog(null, "Der eingegebene Wert " + val + " liegt nicht im gültigen Bereich von " + min + " bis " + max + "!", "Hinweis", JOptionPane.INFORMATION_MESSAGE);
}
return gueltig;
}
}