# JTable alte Daten vor Änderung abfangen



## mr.warft (3. Jan 2008)

Hallo,

ich würde gerne wissen, ob es möglich ist und dann auch wie es gemacht wird  :roll: das ich die Daten die in einer jTable stehen direkt vor der Änderung abfangen kann. 

Bsp: In einer Zelle steht 12 und ich ändere den Wert auf 21 - dann bekomme ich vom TableModelListener einen Meldung das ein Wert geändert wurde und das dieser jetzt 21 ist...nun würde ich den alten Wert aber auch noch haben, da dann die Veränderung in eine DB geschrieben werden soll (es gibt sonst keine ID in der DB...die setzt sich aus den Werten in der Tabelle zusammen, da die Eindeutig sind).

Wäre nett wenn mir da jemand helfen könnte...ich probiere nun schon seid 2h und bekomme nichts brauchbares hin. Ich habe auch schon mit dem ListSelectionListener versucht aber das ist auch nicht das was ich suche. :bahnhof: 

Gruß


----------



## lhein (3. Jan 2008)

Ich denke Du solltest einfach sauber zwischen Daten und GUI trennen, dann stellt sich diese Problematik eigentlich gar nicht.

lr


----------



## Gast2 (3. Jan 2008)

einfach bevor der wert geändert wurde die zelle abfragen und irgendwo zwischenspeichern


----------



## mr.warft (3. Jan 2008)

SirWayne hat gesagt.:
			
		

> einfach bevor der wert geändert wurde die zelle abfragen und irgendwo zwischenspeichern



kannst du mir vielleicht auch noch sagen, wie das gemacht werden soll? Genau sowas suche ich.

Danke


----------



## Gast2 (3. Jan 2008)

du musst doch wissen wo du deine tabelle neufüllst .... Ich mein die ändert sich ja nicht einfach so


----------



## mr.warft (3. Jan 2008)

SirWayne hat gesagt.:
			
		

> Ich mein die ändert sich ja nicht einfach so



das ist richtig...aber trotzdem weiß ich immer noch nicht wo ich den alten Wert abfangen sollte.

hier ein Teil des Codes (ist ein bisschen durcheinander, da es zum Testen dient)


```
public JPanel initGUI() {
		
		try {
			javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
			
					ArrayList<Aequivalenzziffer> al = new ArrayList<Aequivalenzziffer>();
					al = new AequivalenzzifferConnect().getArrayList();
					Object[][] data = {};

					TableModel jTable1Model = new DefaultTableModel(data, new String[] { "Kostenstellen Nr", "Kostenträger Nr", "Aequivalenzziffer" });
					jTable1 = new JTable(jTable1Model);
					DefaultTableModel jTableModel = (DefaultTableModel) jTable1.getModel();

					for (Aequivalenzziffer ae : al){
						Object[] data2 = {
								ae.getKostenstellenNr(),
								ae.getKostentraegerNr(),
								ae.getZiffer()};
						
						jTableModel.addRow(data2);
						}
					jScrollPane1 = new JScrollPane(jTable1);
					jTableModel.addTableModelListener(this);
					jTable1.getSelectionModel().addListSelectionListener(this);
					jPanel = new JPanel(new BorderLayout());
					jPanel.setLayout(null);
					jPanel.setPreferredSize(new Dimension(474, 485));
					jPanel.add(jScrollPane1);
					jPanel.add(getSafeButton());
					jPanel.add(getCancelButton());
					jScrollPane1.setBounds(10, 0, 454, 432);
					

		} catch (Exception e) {
			e.printStackTrace();
		}
		
		kostenStellen = jTable1.getColumnModel().getColumn(0);
		KostenstellenGui ko = new KostenstellenGui();
		koStBox = new JComboBox(ko.getdd());
		kostenStellen.setCellEditor(new DefaultCellEditor(koStBox));
		koStBox.addItemListener(this);
		
		TableColumn kostenTraeger = jTable1.getColumnModel().getColumn(1);
		ArtikelAendern aa = new ArtikelAendern();
		JComboBox artBox = new JComboBox(aa.getdd());
		kostenTraeger.setCellEditor(new DefaultCellEditor(artBox));
		
		return jPanel;
	}

	private JButton getSafeButton() {
		if(safeButton == null) {
			safeButton = new JButton();
			safeButton.setText("Speichern");
			safeButton.setBounds(109, 451, 81, 23);
		}
		return safeButton;
	}
	
	private JButton getCancelButton() {
		if(cancelButton == null) {
			cancelButton = new JButton();
			cancelButton.setText("Abbruch");
			cancelButton.setBounds(276, 451, 75, 23);
			cancelButton.addActionListener(this);
		}
		return cancelButton;
	}
	
	public void tableChanged(TableModelEvent e) {
		int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object data = model.getValueAt(row, column);
        System.out.println("row und column "+row +" "+column);
        System.out.println("model: "+model);
        System.out.println("ColumnName: "+columnName);
        System.out.println("data: "+data);

        
        System.out.println("es wurde etwas geändert.");
		
	}

	public void valueChanged(ListSelectionEvent e) {
		int row = e.getFirstIndex();
		System.out.println("etwas wurde selektiert. "+ row);
		
	}
	

	public void actionPerformed(ActionEvent e) {
		Object src = e.getSource();
		if (src == cancelButton){
			jPanel.removeAll();
			jPanel.setEnabled(false);
		}
	}
```

wäre nett, wenn du mir hier zeigen könntest, wo ich den alten Wert abfangen könnte.

Danke


----------



## Gast2 (3. Jan 2008)

AHJA keine ahnung was du mir jetzt geschickt hast, aber ich seh nirgends wo sich die tabelle ändert außer in der initGUI()... aber da sie init heißt denk ich mir mal dass das der anfngwert der tabelle ist


----------



## mr.warft (3. Jan 2008)

die Tabelle selbst stammt von DefaultTableModel ab und ist damit editierbar. Ich kann die Werte in der Tabelle editieren und dann auch verändern...funktioniert auch so wie ich es mir gedacht habe. Nun würde ich aber gerne, bevor der Wert geändert wird, den alten Wert der Celle irgendwo in ner Variable zwischen speichern wollen. Aber ich komme mit all meinen Versuchen immer nur an den neuen Wert.

Verstehtst du mein Problem?


----------



## Gast2 (3. Jan 2008)

add ein MouseListener auf die Tabelle und frag die zelle in die reingeklickt wird ab...


----------



## Guest (3. Jan 2008)

guck doch mal hier

java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

da wird das mit nem AbstracTableModel gemacht. 
In der Methode setValueAt sollte man auch noch auf den alten Wert zugreifen können.


----------



## Gast2 (3. Jan 2008)

kannst dir auch ein eigenes Model machen...

EDIT: ist in dem link oben mit drin--> nicht gesehen =)


----------



## mr.warft (3. Jan 2008)

SirWayne hat gesagt.:
			
		

> kannst dir auch ein eigenes Model machen...



das mit dem eigenem Model ist wohl auch beim nächsten mal die bessere Wahl. Ich benutze zur Zeit das DefaultTableModel aber ich musste nun schon so oft etwas anpassen (und das denn in jeder Tabelle  :autsch: )

Danke für die nützlichen Tipps...beim nächsten mal wird alles besser  :lol: 

Super Forum  :applaus:  :applaus:  :applaus:


----------

