JTable Problem

programma

Mitglied
Hallo ich bekomme mein JTable leider nicht aktualisiert... vielleicht könnt ihr mir ja helfen?

Also ich programmiere zur Zeit ein Woerterbuch in Java mit einer Access DB wo die wörter drin gespeichert sind.

so jetzt habe ich die Klasse VokabelLoeschen dort holt er sich die Vokabeln per Aufruf von einer Klasse HoleEintrage (dort sind alle Methoden Zentral abgelegt)

In der Klasse VokabelLoeschen ist ein Button der an einem ActionListener namens BearbeiterVokabelLoeschen hängt.

Beim Start von VokabelLoeschen klappt alles Prima die Wörter werden in einer JTable richtig ausgegeben !
Beim markieren einer Zeile und ein Klick auf den Button klappt auch der löscht auch das markierte Feld, aber ich habe jetzt das Problem dass er das JTable nicht aktualisiert, wie bekomme ich es hin, dass er die JTable neu lädt

Ich freue mich auf alle Antworten

Ich poste hier auch mal zur Übersicht ein paar Quelltext Abschnitte von beiden Klassen

Klasse VokabelLoeschen :

public VokabelLoeschen()
{
klassehole = new HoleEintrageausDB();
setTable(klassehole.holeDBEintrage());
this.erzAnsicht();

}


public JTable getTable() {
return table;
}

public void setTable(JTable table) {
this.table = table;
}

public void erzAnsicht()
{

this.table = getTable();

setTable(table);

this.table = getTable();

JPanel panelgesamt = new JPanel (new BorderLayout());

JPanel panelflowbutton = new JPanel(new FlowLayout());

JButton buttonloeschen = new JButton("Löschen");

// klassehole.beendeDBVerbindung();
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

JScrollPane jsp = new JScrollPane(table);
jsp.setBorder(BorderFactory.createTitledBorder("Alle Wörter in der Datenbank"));

BearbeiterVokabelLoeschen bvl = new BearbeiterVokabelLoeschen(table,jsp);
buttonloeschen.addActionListener(bvl);

panelflowbutton.add(buttonloeschen);



Klasse BearbeiterVokabelLoeschen:


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class BearbeiterVokabelLoeschen
implements ActionListener
{
private JTable table;
private HoleEintrageausDB klassehole;
private JScrollPane jsp;

public BearbeiterVokabelLoeschen(JTable table, JScrollPane jsp)
{
this.table = table;
this.jsp = jsp;

}
public void actionPerformed(ActionEvent ab)
{

String sql = "";
String loeschwort = table.getValueAt(table.getSelectedRow(),table.getSelectedColumn()).toString();
System.out.println(table.getSelectedColumn());

if(table.getSelectedColumn()== 0)
{
sql = "Delete * from woerter where wort1 like '" + loeschwort + "'";
}
else if (table.getSelectedColumn() == 1)
{
sql = "Delete * from woerter where wort2 like'" + loeschwort + "'";
}

VokabelLoeschen vl = new VokabelLoeschen();


table = new JTable();

klassehole = new HoleEintrageausDB();

klassehole.loescheVokabel(sql);



ps: Die Klasse HoleEintrageausDB ist die Zentrale Klasse wo alle Methoden abgelegt sind, die Methode um alle vokabeln rauszulesen heisst "klassehole.holeDBEintrage()"
diese Methode liefert mir ein JTable !

Danke im voraus !
 
Moin!
Bitte das nächste mal den Code auch mit den entsprechende Tags formatieren, das erhöht die Übersichtlichkeit gewaltig..

Sobald die Änderungen durchgeführt sind, d.h. du Daten aus der Tabelle gelöscht hast, informierst du die Tabelle auch darüber? Sprich, rufst du etwas derart auf:
Code:
yourTableModel.fireTableDataChanged();

*grüssle*
MeinerEiner
 
oh ok, sorry...

nein irgendwie habe ich das nicht verstanden mit dem Model ich schicke dir mal den Quelltext von der Klasse HoleEintrage dir mir das JTable gibt im Anhang als Screenshot.

Nein so ein Aufruf mit fire... hab ich nicht wo muss das rein und wie muss ich das machen? Hab es zwar mal versucht aber wusste nicht wie das geht..:)
 

Anhänge

  • HoleEintrageausDB.jpg
    HoleEintrageausDB.jpg
    25 KB · Aufrufe: 33
  • VokabelLoeschen.jpg
    VokabelLoeschen.jpg
    31,1 KB · Aufrufe: 20
Hallo,

ich versuche es dir mal ganz kurz das mit dem Model und der Table zu erklären.

Du schreibst dir eine Klasse myModel oder ähnlich die von der Klasse AbstractTableModel erbt. Da musst du dann ein paar Methoden ausprogrammmiern. Wie man sowas machen könnte siehst du in den Links weiter unten. Wie du die Daten dann in dem Model hälst, ist egal, da kann eine ArrayList sein oder ein Array oder egal was, da du ja im Model sagst, wie die Daten in die Tabelle kommen.
Änderst du jetzt die Daten rufst du nachdem du die Daten geändert hast die Methode
Code:
yourTableModel.fireTableDataChanged();
auf. Dann ändert sich die Ansicht deiner Tabelle ganz automatisch.

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data
http://forum.java.sun.com/thread.jspa?threadID=344635&messageID=1424166


MFG

zEriX
 
ja ok ich mache grad ne abstractModel klasse aber ich bekomme von einer klasse ein Vector geliefert wo die ganzen einträge drin enthalten sind wie mache ich das dann?

mfg
 
Ich habe dir mal einen Post aus dem Link von zerix kopiert...
Der sollte dir weiterhelfen :)

Java:
import javax.swing.*;
import javax.swing.table.*;
import java.util.Vector;
 

public class myTableModel extends AbstractTableModel {
    
    Vector dat=null;
    String[] headers=null;
    
    public myTableModel(Vector v){
        setVector(v);
    }
    
    public String getColumnName(int col){
        if ( headers.length > col )
            return headers[col];
        return null;
    }
    
    public Class getColumnClass(int col){
        return Object.class;
    }
 
    
    public Vector getVectorData(){
        return dat;   
    }
    
    public int getRowCount(){
        return dat.size();
    }
    
    public int getColumnCount(){
        return headers.length;
    }
    
    public Object getValueAt(int r,int c) {
        Object[] row=(Object[])dat.elementAt(r);
        return row[ c];
    }
    
    public void setVector(Vector v) {
        dat=v;
        headers=(String[])dat.elementAt(0);
        dat.removeElementAt(0);
        this.fireTableStructureChanged();
    }
}

Ich habe das erste mal einfach mit einem DefaultTableModel gearbeitet... das absolut ausgereicht, versuch es vielleicht damit mal :)

Viel Glück!
 
Ich weiß ja nicht wie die Daten in deinem Vector drin stehen. Das musst du selbst entscheiden. Bei der Methode
Code:
getValueAt(int row, int column)
kannst du festlegen, was bei deiner Tabelle angezeigt wird. Du könntest zum Beispiel schauen in welcher Zeile und Spalte du dich befindest und dann das richtige aus dem Vector zurück geben.
Oder du schreibst deine Daten, nachdem du sie als Vector erhalten hast, in ein 2D-Array und benutzt das dann ein deinem Model, dann brauchst du nur noch das richtige Feld auszugeben.

MFG

zEriX
 
ok ich habs endlich hinbekommen ! Habe ein DefaultTableModel zurückgegeben von meiner Methode und wenn die sachen geändert wurden habe ich einfach das selbe JTable.setModel(neues DefaultTableModel) genommen und ein firetableDataChanged() losgelassen und jetzt t es wunderbar !! danke euch nochmal...
 

Neue Beiträge

Zurück