J
jacquipre79
Gast
Hallo!
Ich suche nun schon seit Tagen nach einer Lösung für mein Problem. Ich habe auch schon dieses Forum "durchforstet", konnte aber noch keine passende Antwort finden. Vielleicht könnt ihr mir weiterhelfen...
Das Problem:
Ich habe eine Tabelle mit 2 Spalten und 2 Zeilen. In dieser Tabelle kann man in einer Zelle einen Text eingeben. Wenn die Enter-Taste betätigt wird, überprüfe ich den Inhalt der Zelle. Hat dieser spezielle, von mir nicht erlaubte Sonderzeichen, dann öffne ich ein kleines Dialogfenster mit einem Hinweis dazu. Schließt man das Dialogfenster wieder, soll die zuvor verwendete Tabellenzelle wieder selektiert sein und der Textcursor (Caret) soll zu sehen sein. Das bekomme ich nicht hin.
Hier mal mein Aufbau:
Mein Editor ist ein JPanel und enthält die JTable:
Zudem hat diese Klasse noch eine setValueAt-Methode, in der ich auch die Überprüfung des Textes vornehme:
Es gibt auch ein eigenes Table Model innerhalb dieser Klasse:
Ich hoffe, das ist jetzt verständlich!
-- jacquipre
Ich suche nun schon seit Tagen nach einer Lösung für mein Problem. Ich habe auch schon dieses Forum "durchforstet", konnte aber noch keine passende Antwort finden. Vielleicht könnt ihr mir weiterhelfen...
Das Problem:
Ich habe eine Tabelle mit 2 Spalten und 2 Zeilen. In dieser Tabelle kann man in einer Zelle einen Text eingeben. Wenn die Enter-Taste betätigt wird, überprüfe ich den Inhalt der Zelle. Hat dieser spezielle, von mir nicht erlaubte Sonderzeichen, dann öffne ich ein kleines Dialogfenster mit einem Hinweis dazu. Schließt man das Dialogfenster wieder, soll die zuvor verwendete Tabellenzelle wieder selektiert sein und der Textcursor (Caret) soll zu sehen sein. Das bekomme ich nicht hin.
Hier mal mein Aufbau:
Mein Editor ist ein JPanel und enthält die JTable:
Code:
public class MyEditor extends javax.swing.JPanel {
...
private javax.swing.JTable innerTable; // Tabelle
private MyEditor.Model myModel = new MyEditor.Model(this); // TableModel
private MyEditor.CellRenderer myRenderer = new MyEditor.CellRenderer(this); // CellRenderer
private final MyCellEditor myEditor = new MyCellEditor(this); // CellEditor
public MyEditor() {
...
initComponents();
this.innerTable.setDefaultRenderer(String.class, this.myRenderer);
this.innerTable.setDefaultEditor(String.class, this.myEditor);
...
this.innerTable.setSurrendersFocusOnKeystroke(true);
}
private void initComponents() {
innerTable = new javax.swing.JTable();
...
innerTable.setModel(this.myModel);
innerTable.setOpaque(false);
innerTable.setSurrendersFocusOnKeystroke(true);
innerTable.setVerifyInputWhenFocusTarget(false);
innerTable.setCellEditor(myEditor);
add(innerTable, java.awt.BorderLayout.CENTER);
...
}
Zudem hat diese Klasse noch eine setValueAt-Methode, in der ich auch die Überprüfung des Textes vornehme:
Code:
private void setPropertyValueAt(int index, int columnIndex, Object value) {
if (!value.toString().matches("[a-zA-Z0-9_]*"))
{
javax.swing.JOptionPane.showConfirmDialog(null,"No special characters allowed", "Error",
javax.swing.JOptionPane.DEFAULT_OPTION,
javax.swing.JOptionPane.WARNING_MESSAGE);
// ======= Hier jetzt die letzte Zelle wieder selektieren ==========
// probiert bis jetzt:
// this.innerTable.changeSelection(index, columnIndex, false, false); // hebt die Zelle farblich hervor, setzt aber nicht den Textcursor
// this.innerTable.editCellAt( index, columnIndex); // ich bin in einer Endlosschleife, d.h. der Fehlerdialog erscheint ständig
}
...
}
Es gibt auch ein eigenes Table Model innerhalb dieser Klasse:
Code:
class Model extends AbstractTableModel {
private static final long serialVersionUID = 1L;
MyEditor myOwner;
private Model(MyEditor pOwner) {
this.myOwner = pOwner;
}
public int getColumnCount() {
return 2;
}
public int getRowCount() {
return this.myOwner.myKeys.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return (columnIndex == 0 ? this.myOwner.getPropertyNameAt(rowIndex) : this.myOwner.getPropertyValueAt(rowIndex));
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return (columnIndex == 1);
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
this.myOwner.setPropertyValueAt(rowIndex, columnIndex, aValue);
}
public Class<String> getColumnClass(int columnIndex) {
return String.class;
}
}
Ich hoffe, das ist jetzt verständlich!
-- jacquipre