JTable mit AbstractTableModel ändern funktioniert nicht

Status
Nicht offen für weitere Antworten.

Waldi

Bekanntes Mitglied
Hallo Leute

Ich habe diese JTable:
Code:
private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable();
			
			jTable.setModel(atm);
			
			jTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 
			jTable.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); 
			
			TableColumnModel columnModel = jTable.getColumnModel(); 
			columnModel.getColumn( 0 ).setPreferredWidth( 80 ); 
			columnModel.getColumn( 1 ).setPreferredWidth( 50 ); 
		    columnModel.getColumn( 2 ).setPreferredWidth( 140); 
		    columnModel.getColumn( 3 ).setPreferredWidth( 30 );
			
			TableColumn bezeichnungsColumn = jTable.getColumnModel().getColumn(2);
			bezeichnungsColumn.setCellEditor(new DefaultCellEditor(getJComboBoxBezeichnung()));
			
			//TableColumn idColumn = jTable.getColumnModel().getColumn(3);
						
			JTableHeader header = jTable.getTableHeader(); 
			header.setReorderingAllowed(false);
			
			atm.addTableModelListener(new InteractiveTableModelListener());
			
		}
		return jTable;
	}

Und dieses Model
Code:
public class MyTableModel extends AbstractTableModel
{ 
	/**
	 * 
	 */
	private static final long serialVersionUID = -9072279854289269980L;
	
	private Vector data;
	private Vector columNames;
	
	/**
	 */
	public MyTableModel(Vector columNames, Vector data)
	{
		this.columNames = columNames;
		this.data = data;
	} 
	
	
	
	public int getRowCount() {
		// TODO Automatisch erstellter Methoden-Stub
		return data.size();
	}
	public int getColumnCount() {
		// TODO Automatisch erstellter Methoden-Stub
		return columNames.size();
	}
	public Object getValueAt(int rowIndex, int columnIndex) {
		Vector rowVector = (Vector)data.elementAt(rowIndex);
		return rowVector.elementAt(columnIndex);
	}
	
	
	public boolean isCellEditable(int row, int column) 
	{
		if (column < 3) 
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	public String getColumnName(int col) { 
		return columNames.elementAt(col).toString(); 
	}
}

Ich füge über normal Text Fields dateien in eine Datenbank ein. Danch aktualisiere ich die Vectoren die die Tabelle bilden(was auch funktioniert) und weise der Tabelle das Modell mit den neuen Vectoren zu. Das mach ich so:

Code:
getTableFromDatabase(1);
					getJTable().setModel(atm);
					atm.fireTableDataChanged();

Nur die Tabelle aktualisiert sich nicht was mach ich falsch?? Die oben genannte Aktion läuft ab wenn ich auf einen JButton klicke.

weiterhin habe ich noch ein:
Code:
public class InteractiveTableModelListener implements TableModelListener 
	{ 
		public void tableChanged(TableModelEvent evt) 
		{ 
			String abfrage = "UPDATE zeltdetail SET schlüssel = ?, anzahl = ?, bezeichnung = ?, zelt = ? WHERE zdid = ?";
			if (evt.getType() == TableModelEvent.UPDATE) 
			{ 
				//int column = evt.getColumn(); 
				int row = evt.getFirstRow(); 
				
				try
				{ 
					PreparedStatement psStmt = DBVerbindung.verbindung.prepareStatement(abfrage);
					
					for (int column = 0; column < getJTable().getColumnCount(); column++) 
					{ 
						Object value = getJTable().getValueAt(row, column); 
						
						if(value==null)
						{ 
							value = ""; 
						}
						if (column == 0) 
						{
							psStmt.setString(column+1,value.toString());
						}
						if (column == 1) 
						{
							psStmt.setInt(column+1,Integer.parseInt(value.toString()));
						}
						if (column == 2) 
						{
							int bezID = z.getZeltDetailBezeichnungID(value.toString());
							psStmt.setInt(column+1,bezID);
						}
					}
					
					psStmt.setInt(4,z.getIID());
					psStmt.setInt(5,Integer.parseInt(getJTable().getValueAt(row,3).toString()));
					psStmt.executeUpdate(); 
					psStmt.close(); 
				} 
				catch(SQLException my_sqlex) 
				{
					System.out.println("**************************************************************************");
					System.out.println("ERROR: Datenbankfehler: " + my_sqlex.getMessage());
					System.out.println("--------------------------------------------------------------------------");
					String sFehlermeldungSQL = my_sqlex.getMessage();
					JOptionPane.showMessageDialog (null,sFehlermeldungSQL);
					my_sqlex.printStackTrace();
					System.out.println("**************************************************************************");
				}
				catch(Exception my_ex) 
				{
					System.out.println("**************************************************************************");
					System.out.println("ERROR: Sonstiger Fehler: " + my_ex.getMessage());
					System.out.println("--------------------------------------------------------------------------");
					my_ex.printStackTrace();
					String sFehlermeldung = my_ex.getMessage();
					JOptionPane.showMessageDialog (null,sFehlermeldung);
					System.out.println("**************************************************************************");
				}
			} 
		}
		
	}

Dieser hat mal funktioniert, jetzt macht er gar nichts mehr.

Bitte verweist mich nicht auf die FAQ. Ich hab die schon so oft und runter gekaut. Vielleicht bin ich zu blöd dafür aber ich kann da kein Hinweis auf meine Probleme entecken.

Hoffe ich habe alles gut beschrieben.
 
S

SlaterB

Gast
zumindest musst du erstmal ein komplett lauffähiges Beispiel zusammenbasteln,
ohne DB natürlich,
nur mit nur einer Spalte
Inhalt eine Tabelle ist 'a', Inhalt andere Tabelle ist 'b'

und solchen Firlefanz wie Spaltenbreiten oder
Code:
public boolean isCellEditable(int row, int column) 
   { 
      if (column < 3) 
      { 
         return true; 
      } 
      else 
      { 
         return false; 
      } 
   }
oder
Code:
 System.out.println("**************************************************************************"); 
               System.out.println("ERROR: Sonstiger Fehler: " + my_ex.getMessage());
sofort rausschmeißen,

wenn du dann ein kleines feines Programm aus wenigen Klassen zusammengestellt hast mit einer Main und noch ner einfachen GUI drumherum,
dann kann jeder auch mal auf Run klicken und den Fehler beobachten + schnell lösen
 

Waldi

Bekanntes Mitglied
Wenn dir das weiterhilft kann ich das machen. Allerdings funktioniert ja alles. Also die tabelle wird richtig angezeigt nur eben die beschriebenen Funktionen wie ändern und neu laden funktionieren nicht. Ist das nach deiner sicht richtig so wie es jetzt ist??
 
S

SlaterB

Gast
sagen wir mal ich bin zu dumm, den Fehler mit bloßem Auge zu sehen,
allzu genau kenne ich mich damit aber nicht aus,
daher würde ich mir ein Beispiel schreiben was funktioniert und mit etwas Glück ist der Fehler dann in deinen Codefragmenten enthalten,
ist aber viel Arbeit..

kannst ja zunächt noch auf jemanden warten, dem es direkt einfällt
 

Waldi

Bekanntes Mitglied
So Leute

Wie slaterB schon vorgeschlagen hat habe ich eine Testaplikation erstellen. Jetzt kommt der Hammer: Ich hab vom Prinzip her alles genau so gemacht wie in meinem richtigen Programm und es hat funktioniert. Mit dem Debugger hab ich nun in meinem richtigen Programm nachgeschaut ob der Daten Vector überhaupt aktualisiert wird - wird er. Also denke ich mal das dass neu zuweisen des Models nid funktioniert. Mach ich vielleicht da was falsch?? Kurz zum Ablauf

Vector mit Daten1
Speichern in der Datenbank
Vector aktualisieren -> Vector mit Daten 2
Model nochmals zuweisen
model.fireTableDataChanged();

Hoffe nun ihr könnt mir nun einen Sprung weiterhelfen.
 

Waldi

Bekanntes Mitglied
So das Problem mit der Aktualisierung hätte ich gelöst

Code:
	private void getTableFromDatabase(int zeltID)
	{
		this.gtfd = new GetTableFromDatabase(zeltID);
		this.atm = new MyTableModel(gtfd.getColumn(),gtfd.getData());
	}

die erste Zeile im Rumpf hatte ich nicht drin, somit wurden die Daten nicht ans Modell weitergegeben. Nun habe ich allerdings das Problem das nach
Code:
atm.fireTableDataChanged();

mir die ColumnComboBox und die Breite der Spalten verloren geht. Warum?? Ich dachte Model und View sind voneinander getrennt. Somit müsste das eine doch nichts mit dem anderen zu tun haben oder??
 
G

Guest

Gast
Da ich ja im letzten Post ein bisschen Mus geschrieben habe, bezüglich Daten und Anzeige, kam mir nun die Idee man könnte ja alle sachen wie Spaltenbreite, ColumnComboBox usw. ins Model packen geht sowas überhaupt?? Dann hätte sich nämlich mein zweites Problem auch schon gelöst.
 
S

SlaterB

Gast
zu ComoboBox weiß ich nix,

bei den Spaltenbreiten hilft es vielleicht (und ist allgemein zu empfehlen),
nur ein Model zu verwenden und dessen Daten zu verändern statt ein neues Model zu setzen
 

Waldi

Bekanntes Mitglied
Auf diese idee bin ich auch schon gekommen, allerdings hab ich dann das Problem das sich die Tabelle nicht mehr aktualisiert. Es ist zum verückt werden. Was mach ich denn nur falsch. Bei allen schein das zu funktionieren nur bei mir nicht.
 

HLX

Top Contributor
Wo ist die methode setValueAt(...) vom Tablemodel? Die hast du hoffentlich auch implementiert...
 

Waldi

Bekanntes Mitglied
Diese habe ich im Moment nicht drin. Dürfte aber doch auch nicht so schlimm sein oder? Änderungen die direkt in die Datenbank weitergegeben werden sollen sind nicht sooo wichtig für mich. Für mich ist jetzt eigentlich wichtiger das der Cell Editor und die Spalten so bleiben wie sie sind. Aber vielen Dank für den Hinweis so kann ich an meinem 3. Problem schon weiterfeilen. Ein kleiner Lichtblick am schwarzen Himmel ;-)
 

Waldi

Bekanntes Mitglied
guck ich hab das mir so gedacht (Ich machs vielleicht falsch - weis ich nicht).

Vector 1 -> mit Daten aus Datenbank geladen
Datensatz einfügen
Hole Daten
schreibe sie in einen Vector = Vector 1

In Vector 1 sind also immer die neusten Daten drin.
Vector model zuweisen
model tabelle zuweisen
fire...
Fertig

Wieso muss jetzt der Vector wissen das er sich verändert hat?
 

HLX

Top Contributor
Für dein DB-Update verwendest du die Methode getValueAt() vom Tablemodel. Diese liefert dir das was du zuletzt geladen hast. Deine Veränderung im Editor wird nicht registriert. Das geschieht erst durch die Implementierung von setValueAt():

Code:
public Object setValueAt(int rowIndex, int columnIndex, Object value) { 
      Vector rowVector = (Vector)data.elementAt(rowIndex); 
      rowVector.setElementAt(columnIndex, value); 
   }

Erst damit kann getValueAt() die aktuellen Werte liefern.
 

Waldi

Bekanntes Mitglied
So geil. So geil. Es funktioniert. Zumindest das DB Update. Jetzt muss nur noch die Sache mit der Änderung richtig funzen. So das die Spalten sich nicht verändern und die Column in der richtigen Breite bleibt.

Wa ich nicht verstehe: Die jComboBox und die Spalte sind doch die Sache der Tabelle nicht des Models. Wenn ich das Model neu setze und sage das sich die Daten geändert haben warum verstellt er dann die Tabelle?? Ich habe das gemacht

Code:
getTableFromDatabase(1); //Aktualisiert mein Vectoren und das Model
               atm.fireTableDataChanged();

Und nichts passiert. Vielleicht kanns ja einer erklären. Das würde mir ja ein kleines Stückchen helfen. Wenn ich das geschafft habe kann ich beruhigt auf Fastnacht gehen und mir so einen in den Kanal schütten Uargh
 

André Uhres

Top Contributor
Erstens würde ich das AbstractTableModel so coden (ist einfacher und kann fast alles "by default"):
Code:
   class MyTableModel extends DefaultTableModel{
        public MyTableModel(Vector columNames, Vector data) {
            super(columNames, data);
        }
        public boolean isCellEditable(int row, int column) {
            if (column < 3) {
                return true;
            } else {
                return false;
            }
        }
    }
Zweitens würde ich aus getJTable alles rausnehmen was nicht dazu gehört:
Code:
   private JTable getJTable() {
        jTable = new JTable();
        jTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
        jTable.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        JTableHeader header = jTable.getTableHeader();
        header.setReorderingAllowed(false);
        return jTable;
    }
und den Rest aus der Methode meinetwegen in eine neue Methode "adaptTableModel" packen.
getJTable braucht man nur einmal ganz am Anfang aufzurufen:
Code:
       jTable = getJTable();
        getContentPane().add( new JScrollPane(jTable) );
Zum Auffrischen der JTable genügt dann dies:
Code:
       getTableFromDatabase(1);//erzeugt ein neues "MyTableModel" --> atm
        jTable.setModel(atm);//zeichnet automatisch alles neu
        adaptTableModel();
 
B

Beni

Gast
(Die Erklärungen zu den folgenden Codestücken erfolgte im Chat. So wie ich das verstanden habe, scheint das Problem nun gelöst zu sein)

Im Model
Code:
public class MyTableModel ... {
  public void setData( Vector data ){
    this.data = data;
    fireTableDataChanged();
  }
}

Beim Update
Code:
this.gtfd = new ...
this.atm.setData( gtfd.data );


Zum Rumspielen:
Code:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Beispiel extends JFrame{
    private MyTableModel atm;
    
    public Beispiel(){
        JTable table = new JTable();
        Vector names = new Vector();
        names.add( "10" );
        names.add( "20" );
        names.add( "30" );
        atm = new MyTableModel( names, data());
        table.setModel( atm );
        add( new JScrollPane( table ));
        
        JButton button = new JButton( "Reload" );
        add( button, BorderLayout.SOUTH );
        button.addActionListener( new ActionListener(){
            public void actionPerformed( ActionEvent e ) {
                atm.setData( data() );
            }
        });
    }
    
    public static void main( String[] args ) {
        Beispiel b = new Beispiel();
        b.setBounds( 10, 10, 400, 400 );
        b.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        b.setVisible( true );
    }
    
    private Vector data(){
        Vector data = new Vector();
        while( Math.random() > 0.1 ){
            Vector row = new Vector();
            row.add( new Integer( (int)(Math.random() * 10 )));
            row.add( new Integer( (int)(Math.random() * 20 )));
            row.add( new Integer( (int)(Math.random() * 30 )));
            data.add( row );
        }
        return data;
    }
}


class MyTableModel extends AbstractTableModel
{
   /**
    *
    */
   private static final long serialVersionUID = -9072279854289269980L;
   
   private Vector data;
   private Vector columNames;
   
   /**
    */
   public MyTableModel(Vector columNames, Vector data)
   {
      this.columNames = columNames;
      this.data = data;
   }
   
   public void setData( Vector data ) {
       this.data = data;
       fireTableDataChanged();
   }
   
   public int getRowCount() {
      // TODO Automatisch erstellter Methoden-Stub
      return data.size();
   }
   public int getColumnCount() {
      // TODO Automatisch erstellter Methoden-Stub
      return columNames.size();
   }
   public Object getValueAt(int rowIndex, int columnIndex) {
      Vector rowVector = (Vector)data.elementAt(rowIndex);
      return rowVector.elementAt(columnIndex);
   }
   
   
   public boolean isCellEditable(int row, int column)
   {
      if (column < 3)
      {
         return true;
      }
      else
      {
         return false;
      }
   }
   
   public String getColumnName(int col) {
      return columNames.elementAt(col).toString();
   }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
KeTho1712 Java Swing: JTable standardmäßig füllen, sodass bei Start bereits Datensätze gespeichert sind Allgemeine Java-Themen 1
H Swing JTextArea als TableCellRenderer in JTable - wie Zeilen selektieren? Allgemeine Java-Themen 47
D JTable mit JTextAreas in den Zellen Allgemeine Java-Themen 8
X Swing JTable zeigt nichts Allgemeine Java-Themen 4
G jTable aktualisieren?! Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D falsche Zeile aus JTable in MySQL gelöscht Allgemeine Java-Themen 6
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
V JTable Externe Lib Allgemeine Java-Themen 2
F JTable Pfeiltasten-Verhalten Allgemeine Java-Themen 1
T jTable Gestaffelte Überschriften Allgemeine Java-Themen 22
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
A JTable Bilder Allgemeine Java-Themen 1
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
A JTable - CellRange auslesen Allgemeine Java-Themen 2
A jTable Renderer Allgemeine Java-Themen 5
N JTable filtern Allgemeine Java-Themen 3
hdi JTable#print & Druckgröße Allgemeine Java-Themen 6
S JTable: Model durch ein anderes ersetzen Allgemeine Java-Themen 2
G JTable: ListSelectionListener removen Allgemeine Java-Themen 8
M JTable + ArrayList Allgemeine Java-Themen 3
G Aktualisierung einer JTable erfolgt nicht zuverlässig Allgemeine Java-Themen 14
E Hintergrund einer JTable änden Allgemeine Java-Themen 2
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
P jTable getSelectedRow? Allgemeine Java-Themen 2
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
B LEERE JTable MouseListener + popupmenu Allgemeine Java-Themen 2
X xml aus Zip in JTable Allgemeine Java-Themen 2
L jTable drag & drop einzelner Zeilen Allgemeine Java-Themen 4
S JTable und Spalten löschen Frage Allgemeine Java-Themen 5
H JTable per iText in PDF: Größenanpassung möglich? Allgemeine Java-Themen 2
F XML zu JTable mit JDOM Allgemeine Java-Themen 2
E JTable wird nicht angezeigt Allgemeine Java-Themen 11
Screen ImageIcon in Cell der JTable Allgemeine Java-Themen 2
G JTable mit Keylistener geht nicht Allgemeine Java-Themen 3
C Swing JTable Vector aus DB adden Allgemeine Java-Themen 3
A Swing JTable Polymorphismus Allgemeine Java-Themen 2
trash super + JTable Allgemeine Java-Themen 7
D JTable -> 1Spalte nur zahlen Allgemeine Java-Themen 2
L JTABLE setvalueat methode! Allgemeine Java-Themen 16
C Swing Daten zwischen JTable teilen Allgemeine Java-Themen 6
hdi JTable: Sortierung von Date-Objekten Allgemeine Java-Themen 4
B JTable nach Icon sortieren Allgemeine Java-Themen 6
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5
M jdesktop binding: jTable update nach Änderung... Allgemeine Java-Themen 3
D JTable mit GROUP BY Allgemeine Java-Themen 23
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
X JTable mit Checkboxen -> Setzen (true/false) der Checkboxen per Mouseklick... Allgemeine Java-Themen 3
P JTable drucken Allgemeine Java-Themen 8
A JTable Feldwerte in JTextFelder mit blättern Allgemeine Java-Themen 5
DStrohma [Erledigt] Wieso kann ich Taste 'ENTER' in JTable nicht belegen? Allgemeine Java-Themen 2
M jTable Allgemeine Java-Themen 19
D jTable und TableModel Allgemeine Java-Themen 2
B Exception bei leerem JTable verhindern Allgemeine Java-Themen 10
A Observable BeansBinding an einer JTable bzw. JXTable Allgemeine Java-Themen 3
P Textfile -> Array -> JTable Allgemeine Java-Themen 9
S JTable Aktuelisieren ber Wie ? Allgemeine Java-Themen 4
MQue JComboBox in JTable Allgemeine Java-Themen 4
J Ergebnismenge eines SQL-Queries in JTable anzeigen Allgemeine Java-Themen 3
MQue JTable alles rechts Allgemeine Java-Themen 8
G Checkboxen abfragen,Auswahl sichern, JTable laden Allgemeine Java-Themen 2
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
R JTable und Cell Renderer Allgemeine Java-Themen 3
M JTable: Anzahl Zeichen bei Eingabe Allgemeine Java-Themen 2
S Welche Speicherung von Daten bei Kalendarfunktion der jtable Allgemeine Java-Themen 7
J keylistener auf jtable Allgemeine Java-Themen 19
C JTable, Abstand zwischen Zellen Allgemeine Java-Themen 2
G Eindeutiges Identifizieren einer JTable/Component z.laufzeit Allgemeine Java-Themen 2
G JTable -> ArrayIndexOutOfBoundsException bei Mausklick Allgemeine Java-Themen 2
S JTable editieren + in JTextField schreiben Allgemeine Java-Themen 7
G Daten in / für JTable beim Scrollen nachladen? Allgemeine Java-Themen 5
M JTable verändert Position auf meinem JPanel Allgemeine Java-Themen 3
P JTable Allgemeine Java-Themen 2
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
P JTable setDataVector Allgemeine Java-Themen 2
D Scrollbalken in meiner JTable auf einmal weg. Allgemeine Java-Themen 2
P JTable Allgemeine Java-Themen 8
P JButtons mit JTable verknüpfen Allgemeine Java-Themen 16
G fehler bei JTable mit JDK1.6 Allgemeine Java-Themen 4
M CheckBox in JTable - ich verzweifle gleich Allgemeine Java-Themen 2
P JTable/Vector Allgemeine Java-Themen 5
P JTable Allgemeine Java-Themen 4
E JButton bleibt in der JTable Allgemeine Java-Themen 2
E JButton in einer Zelle von JTable Allgemeine Java-Themen 16
P JTable selektierte Zeile mitwandern Allgemeine Java-Themen 2
F Checkbox in JTable , eigener Cellrenderer -wie gehts weiter? Allgemeine Java-Themen 2
P JTable suchen in einer Spalte Allgemeine Java-Themen 24
G JTable wird nicht richtig aufgebaut Allgemeine Java-Themen 9
C Ausdrucken einer JTable in eine Datei mit Erhalt des Formats Allgemeine Java-Themen 3
W Columns austauschen/verschieben von jtable Allgemeine Java-Themen 3
P 3rd party JTable libraries (freeware/opensource) Allgemeine Java-Themen 19
D JTable aus Eclipse Ok, kompeliert aber nicht Allgemeine Java-Themen 6
G mySQL und JTable Allgemeine Java-Themen 7
D JTable und Buttons Allgemeine Java-Themen 16
B JScrollPane in einer JTable aktualisieren? Allgemeine Java-Themen 9
G CheckBox in JTable Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben