jTable beim Klick auf Button aktualisieren

Status
Nicht offen für weitere Antworten.

skummy

Aktives Mitglied
Hallo Forum,

ich weiß wirklich nicht mehr weiter. Ich habe jetzt 3 Stunden gegooglet und keine wirkliche Antwort auf mein Problem gefunden.

Kurze Erklärung zum Programm:
Es werden aus einer Datenbank Datensätze abgefragt und in ein jTable eingefügt. Bei einem Klick auf einen Button werden neue Datensätze in die Datenbank eingetragen. Danach soll (einfach) jTable mit den neuen Datensätzen angezeigt werden. Das kann doch nicht so kompliziert sein, oder doch?

Zuerst die Klasse, die mir die jTable mit Daten füllt:

Code:
public class TabelleErstellen extends AbstractTableModel {
            private String [] header = {"Absender", "Betreff", "Datum", "Auswählen"};
            private Object[][] data = (Object[][]) getData();
            
            public String getColumnName(int columnIndex) { 
                switch (columnIndex) {
                    case 0:
                        return "Absender";
                    case 1:
                        return "Betreff";
                    case 2:
                        return "Datum";
                    case 3:
                        return "Auswählen";
                    default:
                        
                        return null;
                }
            }
            
            public int getRowCount() {
                return data.length;
            }
            
            public int getColumnCount() {
                return header.length;
            }
            
            public Object getValueAt(int row, int col) {
                
                return data[row][col];
            }
            
            
            public Class getColumnClass(int c) {
                
                switch (c) {
                    case 0:
                        return String.class;
                    case 1:
                        return String.class;
                    case 2:
                        return String.class;
                    case 3:
                        return Boolean.class;
                    default:
                        return null;
                }
            }     
            
            public void setValueAt(Object value, int row, int col) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
                
            }
            
            private int getAnzahl() {
                ResultSet anzahl = null;
                int a_anzahl = 0;
                DBconnect verbindung1 = null;
                try {
                    verbindung1 = new DBconnect("email");
                    anzahl = (ResultSet) verbindung1.getRs("SELECT COUNT('SENDER') FROM MAIL");
                    anzahl.next();
                    a_anzahl = Integer.parseInt(anzahl.getString(1));
                    verbindung1.shutdown();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                return a_anzahl;
            }
            
            public Object getData() {
                
                ResultSet mail = null;
                String datum = null;
                String sender = null;
                String empfaenger = null;
                String betreff = null;
                String inhalt = null;
                
                DBconnect verbindung1 = null;
                int a_anzahl = getAnzahl();
                Object [ ][ ] data = new Object[a_anzahl][4];
                
                try {
                    verbindung1 = new DBconnect("email");
                    mail = (ResultSet) verbindung1.getRs("SELECT DATUM, SENDER, BETREFF FROM mail");
                    while(mail.next()) {
                        datum = mail.getString(1);
                        sender = mail.getString(2);
                        betreff = mail.getString(3);
                        datum = datum.replaceFirst("Date: ", "");
                        sender = sender.replaceFirst("From: ", "");
                        betreff = betreff.replaceFirst("Subject: ", "");
                        data[a_anzahl-1][0] = sender;
                        data[a_anzahl-1][1] = betreff;
                        data[a_anzahl-1][2] = datum;
                        data[a_anzahl-1][3] = new Boolean(false);
                        a_anzahl--;
                    }
                    
                    verbindung1.shutdown();
                    
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                return data;
            }
        }

Um die Tabelle anzuzeigen mache ich dann nach InitComponents(Netbeans GUI Zeug):

Code:
       TabelleErstellen tabelle = new TabelleErstellen();        
       jTable1.setModel(tabelle);
       jTable1.setShowVerticalLines(false);

Und dann bin ich mit meinem Latein am Ende. Wie bekomme ich die Tabelle nun dazu sich nach einem Klick auf den Button, der neue Datensätze in die Datenbank schreibt, zu aktualisieren?

Ich habe irgendwas mit DefaultModel gelesen usw. aber ich habe keine wirkliche Ahnung, was ich da wo einfügen muss.

Vielen Dank für jeden Tipp.

Tschau
 
skummy hat gesagt.:
..Wie bekomme ich die Tabelle nun dazu sich nach einem Klick auf den Button,
der neue Datensätze in die Datenbank schreibt, zu aktualisieren?..
Das Model leeren (DefaultTableModel#setRowCount(0)) und neu füllen(DefaultTableModel#addRow(..)),
oder einfach neues Model mit den neuen Daten setzen (JTable#setModel(..)).
 
AbstractTableModel dürfte doch diese Methoden besitzen (DefaultTableData erbt ja von AbtractTableModel) oder? Also müsste ich doch mit

Code:
TabelleErstellen tabelle = new TabelleErstellen(); 
tabelle.setRowCount(0);

die Methode so verwenden können?!
Jedenfalls gibt es setRowCount bei mir nicht, was nun?

Danke und Tschau
 
Du könntest von DefaultTableModel ableiten, statt von AbstractTableModel.
Es stimmt, daß DefaultTableModel von AbstractTableModel erbt.
Das bedeutet aber nicht, daß DefaultTableModel keine neuen Methoden haben kann!
 
Mhh, wäre aber damit verbunden, dass ich die Klasse TabelleErstellen umschreiben müsste.

Ich habs jetzt jedenfalls so gelöst, dass ich einfach ein neues Objekt der Klasse TabelleErstellen anlege und damit die Tabelle neu anzeigen lasse. Zwar etwas unschön, aber was solls :wink:

Noch eine generelle Frage, da ich gerade erst anfange mit Java zu programmieren:
Ist der Codestil in Ordnung oder mache ich paar Dinge, die eher nicht zu empfehlen sind?



Nochmals Danke 🙂!

Tschau
 
hi
könntest du mir mal bitte den code zeigen wie du das neue object in die klasse einbindest. habe auch das selbe problem habe 3 klassen. einmal die grundoberfläche in der ich das Jtable anzeigen lassem dann einmal eine klasse tabmodel abgeleitet von AbstractTabemodell und dann einmal eine klasse kunde mit der ich dann neue kunden in die datenbank reinschreibe. ich will jetzt das ich mit dem drücken des ok buttons von der klasse kunde auch das Jtable neuzeichnet die aber in der klasse grundoberfläche ist. wie kann ich das realisieren?

gruss
mavy
 
hi,
ja wie mache ich das? hier ist mein der klasse Kunde mit der ich ein neuen eintrag in die datenbank mache code:
Code:
public class NeuKunde extends JFrame implements ActionListener{
    
	private static final long serialVersionUID = 1L;
	//Definition der Oberfläsche Objects
	JLabel kdnr;
    JTextField kDnr;
    JLabel firmKuerzel;
    JTextField fIrmKuerzel;
    JLabel firma;
    JTextField fIrma;
    JLabel ansprechp;
    JTextField aNsprechp;
    JLabel strasse;
    JTextField sTrasse;
    JLabel land;
    JTextField lAnd;
    JLabel ort;
    JTextField oRt;
    JLabel telenr;
    JTextField tElenr;
    JLabel fax;
    JTextField fAx;
    JLabel email;
    JTextField eMail;
    JLabel vatNr;
    JTextField vAtNr;
    JLabel homep;
    JTextField hOmep;
    JButton ok;
    JButton abbrechen;
    ResultSet rs;
  
    
	public NeuKunde(){
		super("Neuer Kunde");
		kdnr=new JLabel("  Kunden-Nr.");
		kDnr=new JTextField(10);
		firmKuerzel=new JLabel("  Kunden kürzel");
		fIrmKuerzel=new JTextField(10);
		firma=new JLabel("  Kunde");
		fIrma=new JTextField(10);
		ansprechp=new JLabel("  Ansprechpartner");
		aNsprechp=new JTextField(10);
		strasse=new JLabel("  Strasse");
		sTrasse=new JTextField(10);
		ort=new JLabel("  Ort");
		oRt=new JTextField(10);
		telenr=new JLabel("  Telefon-Nr.");
		tElenr=new JTextField(10);
		fax=new JLabel("  Fax-Nr.");
		fAx=new JTextField(10);
		email=new JLabel("  email");
		eMail=new JTextField(10);
		homep=new JLabel("  Homepage");
		hOmep=new JTextField(10);
		vatNr=new JLabel("  VAT-Nr.");
		vAtNr=new JTextField(10);
		land=new JLabel("  Land");
		lAnd=new JTextField(10);
		ok=new JButton("OK");
		ok.addActionListener(this);
		abbrechen=new JButton("Abbrechen");
		abbrechen.addActionListener(this);
		GridLayout gl=new GridLayout(13,2);
		setLayout(gl);
		add(kdnr);add(kDnr);
		add(firmKuerzel);add(fIrmKuerzel);
		add(firma);add(fIrma);
		add(ansprechp);add(aNsprechp);
		add(strasse);add(sTrasse);
		add(ort);add(oRt);
		add(land);add(lAnd);
		add(vatNr);add(vAtNr);
		add(telenr);add(tElenr);
		add(fax);add(fAx);
		add(email);add(eMail);
		add(homep);add(hOmep);
		add(ok); add(abbrechen);
		/*Container c = this.getContentPane(); 
		GridBagLayout gbl = new GridBagLayout(); 
		c.setLayout( gbl ); 
		*/
		pack();
		setVisible(true);
	}
	
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==abbrechen){
			this.dispose();
		}
		if(e.getSource()==ok){
			int kd=Integer.parseInt(kDnr.getText());
			String firmk=fIrmKuerzel.getText();
			String firm=fIrma.getText();
			String ansp=aNsprechp.getText();
			String stras=sTrasse.getText();
			String orT=oRt.getText();
			String laNd=lAnd.getText();
			int tele=Integer.parseInt(tElenr.getText());
			int faX=Integer.parseInt(fAx.getText());
			String emAil=eMail.getText();
			String homEp=hOmep.getText();
			int vat=Integer.parseInt(vAtNr.getText());
			connect(kd,firmk,firm,ansp,stras,orT,laNd,tele,faX,emAil,homEp,vat);
			this.dispose();
			
		}
		
	}
}

und hier meine grundoberfläsche in der mein Jtable mit den einträgen angezeigt wird.
Code:
public class GrundOberFlaesche extends JFrame implements ActionListener{
	private static final long serialVersionUID = 1L;
	//Definition der Oberfläschen
	JMenuBar menuBar;
	JMenu bestand;
	JMenu kunde;
	JMenu schliessen;
	JMenuItem neuKunde;
	JMenuItem suchenKunde;
	JMenuItem buchung;
	JMenuItem loeschenKunde;
	JMenuItem bearbKunde;
	JMenuItem bestandZu;
	JMenuItem bestandAb;
	JButton refresh;
	JTable table=null;
	JScrollPane scroller = null;
//	DefaultTableModel model = new DefaultTableModel();
//	Vector<String> header;
//	Vector<Vector<String>> daten;
//	Vector<String> zeilen;
	//ArrayList spalten=new ArrayList();
  
	
	@SuppressWarnings("deprecation")
	public GrundOberFlaesche(){
		super("");
		TabModel tb=new TabModel();
		tb.loadFromADatabase();
		JTable table=new JTable(tb);
		scroller=new JScrollPane(table);
		add(scroller);
		//Menü Bar
		menuBar= new JMenuBar();
		//Menü Punkt Kunde
		kunde=new JMenu("Kunde");
		neuKunde=new JMenuItem("Neu");
		neuKunde.addActionListener(this);
		bearbKunde=new JMenuItem("Bearbeiten");
		bearbKunde.addActionListener(this);
		suchenKunde=new JMenuItem("Suchen");
		suchenKunde.addActionListener(this);
		buchung=new JMenuItem("Buchung");
		buchung.addActionListener(this);
		loeschenKunde=new JMenuItem("Löschen");
		loeschenKunde.addActionListener(this);
		kunde.add(neuKunde);
		kunde.add(bearbKunde);
		kunde.add(suchenKunde);
		kunde.add(buchung);
		kunde.add(loeschenKunde);
		
		//Menü Punkt Bestand
		bestand=new JMenu("Hauptbestand");
		bestandZu=new JMenuItem("Zubuchen");
		bestandZu.addActionListener(this);
		bestandAb=new JMenuItem("Abbuchen");
		bestandAb.addActionListener(this);
		bestand.add(bestandZu);
		bestand.add(bestandAb);
		
		//Menü Punkt Schliessen
		schliessen=new JMenu("Schliessen");
		//schliessen.addActionListener(this);
		
		//Menubar
		menuBar.add(kunde);
		menuBar.add(bestand);
		menuBar.add(schliessen);
		refresh=new JButton("Refresh");
		refresh.addActionListener(this);
		//add(refresh);
		setJMenuBar(menuBar);
		
		//Hauptfenster
		//setSize(500);
		//setLayout(gl);
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		setSize(d.width,d.height);
		setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		setVisible(true);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new GrundOberFlaesche();
	}
	
	

	public void actionPerformed(ActionEvent e) {
		
		if(e.getSource()==neuKunde){
			new NeuKunde();
			
		}
		if(e.getSource()==bearbKunde){
			new BearbKunde();
		}
		if(e.getSource()==suchenKunde){
			new SuchenKunde();
		}
		if(e.getSource()==buchung){
			new Buchung();
		}
		if(e.getSource()==loeschenKunde){
			new LoeschKunde();
		}
		if(e.getSource()==bestandZu){
			new ZuBuchen();
		}
		if(e.getSource()==bestandAb){
			new AbBuchen();
		}
}
und hier meine AbstractTablemodel
Code:
ublic class TabModel extends AbstractTableModel{ 
  String[] columnNames = 
      { 
      "Kunden-Nr", "Kundenkürzel", "Kunde", "Ansprechpartner", "Strasse", "Ort", "Land","Telefon-Nr.","Fax-Nr.","email","VAT-Nr.","Homepage"}; //Überschriften der Tabelle 

  private Object data[]; 
  private Statement stm = null; 
  private ResultSet rs = null; 
  private ArrayList ar = null; 
  private boolean bErg = true; 
  

  /************************************************************************** 
   * Konstruktor für TabModel, indem die Spaltenbezeichnungen definiert werden 
   * und initDateTable wird aufgerufen 
   *************************************************************************/ 
  public TabModel() 
  { 
    try 
    { 
      columnNames[0] = "Kunden-Nr"; 
      columnNames[1] = "Kundenkürzel"; 
      columnNames[2] = "Kunde"; 
      columnNames[3] = "Ansprechpartner"; 
      columnNames[4] = "Strasse"; 
      columnNames[5] = "Ort"; 
      columnNames[6] = "Land"; 
      columnNames[7] = "Telefon-Nr.";
      columnNames[8] = "Fax-Nr.";
      columnNames[9] = "email";
      columnNames[10] ="VAT-Nr.";
      columnNames[11] ="Homepage";
    } 
    catch (Exception ex) 
    { 
      ex.printStackTrace(); 
    } 

  } 

  /*************************************************************************** 
   * Spaltenanzahl 
   * @return Anzahl der Spalten 
   *************************************************************************/ 
  public int getColumnCount() 
  { //Anzahl der Spalten 
    return columnNames.length; 
  } 

  /*************************************************************************** 
   * Zeilenanzahl 
   * @return Anzahl der Zeilen 
   *************************************************************************/ 
  public int getRowCount() 
  { //Anzahl der Zeilen 
    if (data == null) 
      return 0; 
    return (data.length); 
  } 

  /************************************************************************** 
   * Name einer Spalte 
   * @param iCol Position der Spalte 
   * @return Name der übergebenen Spalte 
   *************************************************************************/ 
  public String getColumnName(int iCol) 
  { //Name der Spalten 
    return columnNames[iCol]; 
  } 

  /************************************************************************** 
   * Wert einer Spalte in einer bestimmten Zeile 
   * @param iRow Index der Zeile 
   * @param iCol Position der Spalte 
   * @return Wert an der Stelle row / col 
   *************************************************************************/ 
  public Object getValueAt(int iRow, int iCol) 
  { //Retouniert Wert an bestimmter Stelle 
    Object objRet = null; 

    if (iRow < data.length && data[iRow] != null) // gibt die Objekte zurück 
    { 
      Haupt pl = (Haupt) data[iRow]; 
      switch (iCol) 
      { 
        case 0: 
          objRet = Integer.toString(pl.kd_nr); 
          break; 
        case 1: 
          objRet = pl.firmenk; 
          break; 
        case 2: 
          objRet = pl.kunde; 
          break; 
        case 3: 
          objRet = pl.ansprech_p; 
          break; 
        case 4: 
          objRet = pl.strasse; 
          break; 
        case 5: 
          objRet = pl.ort; 
          break; 
        case 6: 
          objRet = pl.land; 
          break; 
        case 7: 
          objRet = Integer.toString(pl.telefon_nr); 
          break;
        case 8: 
          objRet = Integer.toString(pl.fax_nr); 
          break;
        case 9: 
          objRet = pl.email; 
          break;
        case 10: 
          objRet = Integer.toString(pl.vta_nr); 
          break;
        case 11: 
          objRet = pl.hp; 
          break;

      } 
    } 
    return objRet; 
  } 


  /************************************************************************* 
   * Hinweis: Je für Programm abänderbar 
   * @param row Index der Zeile 
   * @param col Position der Spalte 
   * @return false für not editable, true für editable 
   *************************************************************************/ 
  public boolean isCellEditable(int row, int col) 
  { 
    return true; 
  } 


  /************************************************************************** 
   * Lädt die Daten von der Datenbank einmal in datatable und einmal in einen array 
   * und danach in data 
   *************************************************************************/ 
  public void loadFromADatabase() 
  { 
	DatabaseConnection dbcon = new DatabaseConnection();
	Connection con = null;
	con = dbcon.openConnection();
    try 
    { 
      Statement stm = con.createStatement();
      ar = new ArrayList(); 

      //führt den SQL Befehl aus 
      rs = stm.executeQuery("SELECT * FROM haupt"); //man kann die Daten auch anders holen, und zwar File einlesen, usw 

      if (!rs.next()) // falls es kein nächstes gibt 
        bErg = false; 

      if (bErg) // default mäßig auf true, falls es kein Ergebnis gibt geht er nicht rein 
      { 
        do 
        { 
          bErg = true; 
          Haupt pl = new Haupt(); 
          pl.kd_nr = rs.getInt(2); 
          pl.firmenk = rs.getString(3); 
          pl.kunde = rs.getString(4); 
          pl.ansprech_p = rs.getString(5); 
          pl.strasse = rs.getString(6); 
          pl.ort = rs.getString(7); 
          pl.land= rs.getString(8);
          pl.telefon_nr=rs.getInt(9);
          pl.fax_nr=rs.getInt(10);
          pl.email=rs.getString(11);
          pl.vta_nr=rs.getInt(12);
          pl.hp=rs.getString(13);

         ar.add(pl); //fügt die Klasse in den Array hinzu 

        } 
        while (rs.next()); //solange es einen nächsten gibt 
      } 

      rs.close(); 
      stm.close(); 
      data = ar.toArray(); // Array wird in ein Objekt geholt um es nachher für die Table auszugeben 
      fireTableDataChanged(); // lässt die Tabelle neu zeichnen 
      dbcon.closeConnection();
    } 
    catch (Exception ex) 
    { 
      ex.printStackTrace(); 
    } 
  } 

  /************************************************************************* 
   * Beispiel lädt Daten aus einer Datei die mit ; getrennt sind 
   * @param fFile die Datei 
   ************************************************************************/ 
  public void loadFromAFile(File fFile) 
  { 
    int iAnzToken; // abfrage auf wieviel ; die linie hat 
    StringTokenizer token; 
    String line = "",buf[]; 

    try{ 
      //reader um aus der Datei zu lesen 
      BufferedReader br = new BufferedReader( 
          new InputStreamReader( 
          new FileInputStream(fFile))); 

      //Arrayliste neu initialisieren 
      ar = new ArrayList(); 
      while ( (line = br.readLine()) != null) 
      { 
        token = new StringTokenizer(line, ";", false); //wird davon ausgegangen das es mit ; getrennt ist 
        iAnzToken = token.countTokens(); 
        buf = new String[iAnzToken]; 
        for(int x = 0; x != iAnzToken && token.hasMoreTokens(); x++) 
          buf[x] = token.nextToken(); 

        Haupt pl = new Haupt(); 
        pl.kd_nr = Integer.parseInt(buf[0]); 
        pl.firmenk = buf[1]; 
        pl.kunde = buf[2]; 
        pl.ansprech_p = buf[3]; 
        pl.strasse = buf[4]; 
        pl.ort = buf[5]; 
        pl.land= buf[6];
        pl.telefon_nr=Integer.parseInt(buf[7]);
        pl.fax_nr=Integer.parseInt(buf[8]);
        pl.email=buf[9];
        pl.vta_nr=Integer.parseInt(buf[10]);
        pl.hp=buf[11];

        ar.add(pl); //fügt die Klasse in den Array hinzu 
      } 

     } 
     catch(Exception ex) 
     { 
       ex.printStackTrace(); 
     } 
  } 

  /**************************************************************************** 
   * Funktion liefert ein JTable zurück 
   * @return ein JTable objekt 
   ***************************************************************************/ 
  public JTable getModel() 
  { 
    return new JTable(this); 
  } 

  /**************************************************************************** 
   * Setzt das Model neu! 
   * @param TableModel1 das tablemodel das gesetzt werden soll 
   ***************************************************************************/ 
  public void setModel(TableModel TableModel1) 
  { 
    ar = new ArrayList(); //alles neu schreiben 
    for (int x = 0; x != TableModel1.getRowCount(); x++) 
    { 
      //neues Objekt zum Einhängen 
      Haupt pl = new Haupt(); 
      for (int y = 0; y != TableModel1.getColumnCount(); y++) 
      { 
        switch (y) 
        { 
          case 0: 
            pl.kd_nr = Integer.parseInt(TableModel1.getValueAt(x, y).toString()); 
            break; 
          case 1: 
            pl.firmenk = TableModel1.getValueAt(x, y).toString(); 
            break; 
          case 2: 
            pl.kunde = TableModel1.getValueAt(x, y).toString(); 
            break; 
          case 3: 
            pl.ansprech_p = TableModel1.getValueAt(x, y).toString(); 
            break; 
          case 4: 
            pl.strasse = TableModel1.getValueAt(x, y).toString(); 
            break; 
          case 5: 
            pl.ort = TableModel1.getValueAt(x, y).toString(); 
            break; 
          case 6: 
            pl.land = TableModel1.getValueAt(x, y).toString(); 
            break; 
          case 7: 
            pl.telefon_nr = Integer.parseInt(TableModel1.getValueAt(x, y).toString()); 
            break; 
          case 8: 
            pl.fax_nr = Integer.parseInt(TableModel1.getValueAt(x, y).toString()); 
            break; 
          case 9: 
            pl.email= TableModel1.getValueAt(x, y).toString(); 
            break; 
          case 10: 
            pl.vta_nr = Integer.parseInt(TableModel1.getValueAt(x, y).toString()); 
            break; 
          case 11: 
            pl.hp = TableModel1.getValueAt(x, y).toString(); 
            break; 
        } 
      } 
      ar.add(pl); 
    } 

   data = ar.toArray(); // Array wird in ein Objekt gespeichert um es nachher für die Table auszugeben 
	}
  class Haupt 
  { 
    int kd_nr; 
    String firmenk; 
    String kunde; 
    String ansprech_p; 
    String strasse; 
    String ort; 
    String land; 
    int telefon_nr;
    int fax_nr;
    String email;
    int vta_nr;
    String hp;
  }
}

jetzt wo genau muß ich das machen das tablemodel neu laden

vielen dank schon einaml

gruss
mavy
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben