Hallo Leute,
Ich entwickle momentan sozusagen nebenbei eine kleine Applikation zur Verwaltung unseres betriebsinternen Teeshops. Die wesentliche Logik ist bereits implementiert und getestet. Leider garate ich momentan mit Swing aneinander und hoffe hier auf schnelle Hilfe.
Zur Darstellung von Daten (Mitglieder, Produkte, Abrechnungen usw.) nutze ich JTables, die in eine JScollPane verpackt sind.
Diese Darstellung funktioniert auch soweit.
Ich kann über die GUI bereits neue Objekte anlegen bzw. bestehende löschen usw.
Einzig das Editieren von Daten will nicht klappen.
Um Daten direkt bearbeiten zu können, haben ich im TableModel festgelegt, dass bestimmte Spalten bearbeitet werden können.
Soweit so gut. Ich kann den Text der entsprechenden Zellen auch verändern, jedoch stellt sich sofort die Ursprungswert wieder her, sobald ich die Zelle verlasse.
Beispiel:
Ich habe einen Kunden "Thomas Test". Die JTable zeigt mir nun zunächst dessen KundenID an (nicht editierbar), dann die Vornamen (editierbar), dann den Nachnamen (editierbar), dann den Kontostand (nicht editierbar)
Schreibe ich nun in das Feld, in dem "Thomas" steht "Felix" rein und klicke wonanders hin, steht dort sofort wieder "Thomas"
Vermutung
Ich vermute mal, dass ich irgendwo einen Listener dafür übersehen habe. Da ich mir aber bereits einen Ast gesucht habe, um alleine mal den ListSelectionListener zu finden, wollte ich hier mal nachfragen, wo das Problem ist.
Ansonsten könnte ich mir auch fehlerhaften Verständnis beim Implementieren des TableModels vorstellen
Aufbau
-> Die JTable ist in eine JScrollPane integriert; (um eben die Scrollbarkeit zu haben)
-> Die JTable verfügt jeweils über ein eigenes TableModel
-> Die JTable wurde mit einem ListSelectionListener versehen, welcher dafür sorgt, dass bei einem Klick auf die Liste das aktuell markierte Objekt lokal abgelegt ist (z.B. um es zu löschen)
-> Das SelectionModel der JTable ist auf SINGLE_SELECTION gestellt
Verhalten
-> Nach Verlassen der aktuellen Zelle, wird der ursprüngliche Inhalt wiederhergestellt. Eine Änderung wird nicht übernommen
Gewünschtes Verhalten
-> Ich kann Werte in der Tabelle verändern und danach auf "Speichern" klicken, um die Daten persistent zu übernehmen; Klicke ich nicht auf "Speichern", sollen die Daten beim Verlassen der Ansicht verworfen werden. Somit sollen bestimmte Daten editiert werden können
-> In einer Ansicht "Abrechnung" möchte ich die Verbrauchswerte eintragen können (hier repräsentieren die Zeilen die Kunden und die Spalten die Produkte - in der Table sollen die Verbrauchsmengen pro Kunden und Produkt eingetragen werden.
Anbei das TableModel für die Kundenansicht:
Weiterhin anbei die Implementierung des ListSelectionListeners
Ich entwickle momentan sozusagen nebenbei eine kleine Applikation zur Verwaltung unseres betriebsinternen Teeshops. Die wesentliche Logik ist bereits implementiert und getestet. Leider garate ich momentan mit Swing aneinander und hoffe hier auf schnelle Hilfe.
Zur Darstellung von Daten (Mitglieder, Produkte, Abrechnungen usw.) nutze ich JTables, die in eine JScollPane verpackt sind.
Diese Darstellung funktioniert auch soweit.
Ich kann über die GUI bereits neue Objekte anlegen bzw. bestehende löschen usw.
Einzig das Editieren von Daten will nicht klappen.
Um Daten direkt bearbeiten zu können, haben ich im TableModel festgelegt, dass bestimmte Spalten bearbeitet werden können.
Soweit so gut. Ich kann den Text der entsprechenden Zellen auch verändern, jedoch stellt sich sofort die Ursprungswert wieder her, sobald ich die Zelle verlasse.
Beispiel:
Ich habe einen Kunden "Thomas Test". Die JTable zeigt mir nun zunächst dessen KundenID an (nicht editierbar), dann die Vornamen (editierbar), dann den Nachnamen (editierbar), dann den Kontostand (nicht editierbar)
Schreibe ich nun in das Feld, in dem "Thomas" steht "Felix" rein und klicke wonanders hin, steht dort sofort wieder "Thomas"
Vermutung
Ich vermute mal, dass ich irgendwo einen Listener dafür übersehen habe. Da ich mir aber bereits einen Ast gesucht habe, um alleine mal den ListSelectionListener zu finden, wollte ich hier mal nachfragen, wo das Problem ist.
Ansonsten könnte ich mir auch fehlerhaften Verständnis beim Implementieren des TableModels vorstellen
Aufbau
-> Die JTable ist in eine JScrollPane integriert; (um eben die Scrollbarkeit zu haben)
-> Die JTable verfügt jeweils über ein eigenes TableModel
-> Die JTable wurde mit einem ListSelectionListener versehen, welcher dafür sorgt, dass bei einem Klick auf die Liste das aktuell markierte Objekt lokal abgelegt ist (z.B. um es zu löschen)
-> Das SelectionModel der JTable ist auf SINGLE_SELECTION gestellt
Verhalten
-> Nach Verlassen der aktuellen Zelle, wird der ursprüngliche Inhalt wiederhergestellt. Eine Änderung wird nicht übernommen
Gewünschtes Verhalten
-> Ich kann Werte in der Tabelle verändern und danach auf "Speichern" klicken, um die Daten persistent zu übernehmen; Klicke ich nicht auf "Speichern", sollen die Daten beim Verlassen der Ansicht verworfen werden. Somit sollen bestimmte Daten editiert werden können
-> In einer Ansicht "Abrechnung" möchte ich die Verbrauchswerte eintragen können (hier repräsentieren die Zeilen die Kunden und die Spalten die Produkte - in der Table sollen die Verbrauchsmengen pro Kunden und Produkt eingetragen werden.
Anbei das TableModel für die Kundenansicht:
Java:
package gui.tableModels;
import javax.swing.table.AbstractTableModel;
import bo.Customer;
import core.Fns;
public class TableModelCustomerView extends AbstractTableModel {
private static final long serialVersionUID = 3000475378255148294L;
private Object[][] data;
public TableModelCustomerView(Object[][] data) {
this.data = data;
}
@Override
public int getRowCount() {
return Fns.getAllCustomer().size();
}
@Override
public int getColumnCount() {
return 4;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return this.data[rowIndex][columnIndex];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch(columnIndex){
case 0: return String.class;
case 1: return String.class;
case 2: return String.class;
case 3: return Double.class;
default: throw new IllegalArgumentException("Too many columns @TableModelCustomerView");
}
}
@Override
public String getColumnName(int columnIndex) {
switch(columnIndex){
case 0: return("ID");
case 1: return("Firstname");
case 2: return("Lastname");
case 3: return("Balance");
default: throw new IllegalArgumentException("Too many columns @TableModelCustomerView");
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
switch(columnIndex){
case 0 : return false;
case 1 : return true;
case 2 : return true;
case 3 : return false;
default: throw new IllegalArgumentException("Too many columns @TableModelCustomerView");
}
}
public Customer getCustomerFromRow(int rowIndex){
String uid = (String) this.getValueAt(rowIndex, 0);
return Fns.findCustomerByID(uid);
}
Weiterhin anbei die Implementierung des ListSelectionListeners
Java:
this.table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
CustomerView.this.currentlySelected = ((TableModelCustomerView)CustomerView.this.table.getModel()).getCustomerFromRow(CustomerView.this.table.getSelectedRow());
}
});