JTable: Eingabe in Tabellenzelle korrigieren

javango

Mitglied
Hallo,
ich hab eine Tabelle erstellt, in die der User Hex-Strings eingeben kann. Diese möchte ich nach dem Editieren korrigieren, bevor sie übernommen wird. Ich habe mir den folgenden Editor geschrieben:
Java:
  class FontCellEditor extends DefaultCellEditor {

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
      JTextField editor = (JTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column);
      String s = "";  
      if (value != null) {
        s = value.toString();       
        s = new String(Convert.simpleHexStringCorrection(s)); // meine Korrektur-Funktion
        editor.setText(s);
      }
      return editor;
    }
  }

Das Problem:
Eigentlich funktioniert es so halb, aber erst wenn ich das zweite mal in die Zelle Klicke, Sprich:
Eingabe wird unkorrigiert ausgegeben. Erst beim zweiten mal reinklicken sehe ich die Korrektur im Editor.
Ich vermute, das geht nicht, weil anfangs die Zelle noch leer ist, da kann man ja noch nichts korrigieren. Weiter vermute ich dass ich eventuell den falschen Ansatz habe mit dem CellEditor, weil der darin stehende code offenbar nur wirksam wird, wenn der Zelleninhalt in den Editor übernommen wird, und nicht wenn der Wert vom Editor wieder zurückgegeben wird.
 

Robat

Top Contributor
Ich würde wahrscheinlich eher ein eigenes TableModel implementieren. Sowas in die Richtung:
Java:
public class HexTableModel extends AbstractTableModel {

    private String[] columnNames;
    private Object[][] data;

    public HexTableModel(String[] columnNames, Object[][] data) {
        this.columnNames = columnNames;
        this.data = data;
    }

    private String checkHexString(String value) {
        return "0x" + value;
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public String getColumnName(int column) {
        return columnNames[column];
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        if (col == 1) {
           data[row][col] = checkHexString(String.valueOf(value));
        } else {
            data[row][col] = value;
        }
        fireTableCellUpdated(row, col);
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return data[rowIndex][columnIndex];
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return true;
    }
}
 

javango

Mitglied
Hallo Robat,
danke für Deine Antwort. Das Funktioniert mit deinem Ansatz.

Nun hab ich aber zwei neue Probleme:
1) ich hab in einer Kolonne Checkboxes welche ich mit der Methode getColumnClass realisiert hab:
Java:
        public Class getColumnClass(int c) {
          if (c < getColumnCount()-1)  
            return String.class;
          else
            return Boolean.class;
        }
(Wenn diese Methode einen boolean zurückliefert, wird eine Checkbox in die Zelle eingefügt)
Diese funktioniert aber offenbar im neuen Model nicht.
2) Im DefaultTableModel gibt es eine Methode addRow() und eine removeRow() welche im neuen Model auch nicht existieren. Da gibt es ja einfach dieses Array of Array [][] und dieses kann ich wohl nicht einfach so erweitern oder reduzieren, ohne ein neues Array zu machen und alles komplett umzukopieren?

Eigentlich möchte ich das DefaultTableModel behalten und die Methode setValueAt wie du sie implementiert hast dort einbauen. Nur komme ich nicht an die Daten ran, denn obwohl die Klasse als
Java:
public DefaultTableModel(Object[][] data,
                         Object[] columnNames)
deklariert ist, kann ich auf "data" nicht zugreifen? und setValueAt kann ich ja auch nicht benutzen da ich diese ja überschreiben will (würde rekursiv)
Vielleicht weiss jemand ob ich an diese Daten rankomme?
 

Robat

Top Contributor
Diese funktioniert aber offenbar im neuen Model nicht.
Kann ich so nicht nachvollziehen. Mit dem überarbeiteten Model (stell ich ganz am Ende noch mal rein) funktionieren auch die Checkboxen wunderbar. (Kenne natürlich deine Anforderungen nicht).

Eine Methode um eine Zeile zu löschen oder hinzuzufügen kannst du auch in dem Model implementieren. Dazu würde ich von einem Object[][][iCode] zu einer [iCode]List<Object[]> wechseln, dann geht das ganze etwas einfacher. Zstl. könnte man aus dem Object[] sich noch eine eigene Klasse basteln, das hab ich jetzt hier aber mal weggelassen.
Am Ende könnte die Benutzung dann so aussehen:
Java:
HexTableModel model = new HexTableModel(new String[]{"Spalte1", "Spalte2", ..., "Booleanwert"});
JTable table = new JTable(model);
..
add(table);

buttonToAddRow.addActionListener(e -> {
    HexTableModel model = (HexTableModel) table.getModel();
    model.addRow(new Object[]{"10", "A", Boolean.TRUE});
});
buttonToRemoveRow.addActionListener(e -> {
    HexTableModel model = (HexTableModel) table.getModel();
    model.removeRow(1); //oder
    model.removeRow(object); // wobei object sowas sein sollte new Object[]{ "..", "...", true/false}
}
Das endgültige Model könnte dann so aussehen
Java:
public class HexTableModel extends AbstractTableModel {

    private String[] columnNames;
    private List<Object[]> data;

    public HexTableModel(String[] columnNames, List<Object[]> data) {
        this.columnNames = columnNames;
        this.data = data;
    }

    public HexTableModel(String[] columnNames) {
        this(columnNames, new ArrayList<>());
    }

    private String checkHexString(String value) {
        return "0x" + value;
    }

    @Override
    public int getRowCount() {
        return data.size();
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public String getColumnName(int column) {
        return columnNames[column];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return columnIndex < getColumnCount() - 1 ? String.class : Boolean.class;
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        Object[] rowToBeSet = data.get(row);
        if (col == 1) {
            rowToBeSet[col] = checkHexString(String.valueOf(value));
        } else {
            rowToBeSet[col] = value;
        }
        data.set(row, rowToBeSet);
        fireTableCellUpdated(row, col);
    }

    public void addRow(Object[] row) {
        data.add(row);
        int index = data.indexOf(row);
        fireTableRowsInserted(index, index);
    }

    public void removeRow(int index) {
        if (index >= 0 && index < data.size()) {
            data.remove(index);
            fireTableRowsDeleted(index, index);
        }
    }

    public void removeRow(Object[] row) {
        removeRow(data.indexOf(row));
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return data.get(rowIndex)[columnIndex];
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return true;
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
A JTable Cell Eingabe AWT, Swing, JavaFX & SWT 6
S JTable - Auf spezielle Eingabe nicht reagieren. AWT, Swing, JavaFX & SWT 5
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
M Swing JTable cell leeren bei Eingabe AWT, Swing, JavaFX & SWT 6
S JTable: Eingabe nur für bestimmte Var.Typen zulassen AWT, Swing, JavaFX & SWT 13
eskimo328 JTable nächste Zelle nach Eingabe einer Ziffer AWT, Swing, JavaFX & SWT 5
G JTable - bei falscher Eingabe wird alter Wert genommen. AWT, Swing, JavaFX & SWT 2
M JTable: TableCellEditor nach Eingabe sofort beenden? AWT, Swing, JavaFX & SWT 3
H Eingabe von Zahlen in JTable und Fokusweitergabe AWT, Swing, JavaFX & SWT 4
R JTable, automatischer resize der Zellen nach einer Eingabe AWT, Swing, JavaFX & SWT 4
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben