1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Problem mit Tabellen

  • jimbeam
  • 2. August 2006 um 16:54
  • Unerledigt
  • jimbeam
    11
    jimbeam
    Mitglied
    Reaktionen
    11
    Punkte
    1.201
    Beiträge
    204
    • 2. August 2006 um 16:54
    • #1

    Ich bins nochmal!

    Ich hab ein Problem mit Tabellen: ich habe ein eigenes TableModel. Gibt es eine Funktion die überprüft ob Daten in der Tabelle geändert wurden? Ich habe nämlich 9000 DB-Datensätze und ich will nicht alle immer updaten, dass dauert zu lange!

    Paddys, hm.....

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 2. August 2006 um 17:24
    • #2
    Zitat von jimbeam

    Ich bins nochmal!

    Ich hab ein Problem mit Tabellen: ich habe ein eigenes TableModel. Gibt es eine Funktion die überprüft ob Daten in der Tabelle geändert wurden? Ich habe nämlich 9000 DB-Datensätze und ich will nicht alle immer updaten, dass dauert zu lange!

    javax.swing.table.TableModel#addTableModelListener

    lg, Benjamin Ferrari, bookworm.at

  • jimbeam
    11
    jimbeam
    Mitglied
    Reaktionen
    11
    Punkte
    1.201
    Beiträge
    204
    • 2. August 2006 um 17:31
    • #3

    danke erst mal!

    Aber ich blick mich bei der Anwendung vom Listener nicht ganz durch! Wie komm ich zur gewünschten Zeile?

    Paddys, hm.....

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 2. August 2006 um 18:40
    • #4

    Du must zunaechst einen Listener erzeugen, der die Methode 'tableChanged' ueberschreibt, und ihn an das TableModel anhaengen. die Indices fuer die Zeile und Spalte befinden sich dann im uebergebenen Event.

    Hier eine vollstaendige Demo:

    Java
    /**@Author: Benjamin Ferrari , 2006*/
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
    
    
    
    
    public class JTableExample extends JPanel {
    
    
      private static final long serialVersionUID = 1L;
    
    
      private String[] columnNames = new String[] { "A", "B", "C" };
    
    
      private List<List<Object>> rowData = makeData(columnNames.length);
    
    
      
      public JTableExample() {
        JTable table = createTable();
    
    
        // Hier der Code, in dem auf das aendern eines values reagiert wird.
        // Beachte auch, das du es die methoden event.getFirstRow() und 
        // event.GetLastRow() gibt. Du kannst also auch die aenderungen von
        // mehreren zeilen gleichzeitig abfangen.
        table.getModel().addTableModelListener(new TableModelListener() {
    
    
          public void tableChanged(TableModelEvent event) {
            System.out.println("DEBUG: "
                + rowData.get(event.getFirstRow()).get(event.getColumn()));
          }
    
    
        });
    
    
        this.add(table);
    
    
      }
    
      private List<List<Object>> makeData(int numCols) {
        List<List<Object>> rows = new ArrayList<List<Object>>();
        for (int i = 0; i < 25; i++) {
          List<Object> cols = new ArrayList<Object>();
          for (int j = 0; j < numCols; j++) {
            cols.add(Math.round(Math.random() * 100));
          }
          rows.add(cols);
        }
        return rows;
      }
    
    
      private JTable createTable() {
        return new JTable(new AbstractTableModel() {
    
    
          private static final long serialVersionUID = 1L;
    
    
          public String getColumnName(int col) {
            return columnNames[col].toString();
          }
    
    
          public int getRowCount() {
            return rowData.size();
          }
    
    
          public int getColumnCount() {
            return columnNames.length;
          }
    
    
          public Object getValueAt(int row, int col) {
            return rowData.get(row).get(col);
          }
    
    
          public boolean isCellEditable(int row, int col) {
            return true;
          }
    
    
          public void setValueAt(Object value, int row, int col) {
            rowData.get(row).set(col, value);
    
    
            //hier muss ich angeben, das aenderungen vorgenommen wurden.
            fireTableCellUpdated(row, col); 
          }
        });
      }
    
    
      public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JTableExample());
        frame.pack();
        frame.setVisible(true);
      }
    
    
    }
    Alles anzeigen

    lg, Benjamin Ferrari, bookworm.at

  • jimbeam
    11
    jimbeam
    Mitglied
    Reaktionen
    11
    Punkte
    1.201
    Beiträge
    204
    • 3. August 2006 um 09:05
    • #5

    danke erst mal

    Eine Frage hab ich aber noch! Ich will jetzt erst aktualisieren wenn ich einen Button klicke! Ist das auch möglich?

    Das haut bei mir so nicht hin!

    Paddys, hm.....

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 3. August 2006 um 10:37
    • #6
    Zitat von jimbeam


    Eine Frage hab ich aber noch! Ich will jetzt erst aktualisieren wenn ich einen Button klicke! Ist das auch möglich?


    Das Problem versteh ich jetzt nicht. DU bestimmst doch, wann du die werte updatest (tableChanged), oder wann du sie in die Datenbank schreibst (was du mit dem rowData Object machst).

    * Du must in tableChanged ja nichts in die Datenbank schreiben. Du kannst dir einfach merken was du geaendert hast und erst bei buttonevent darauf reagieren.

    * Du must in setValue nicht die Daten in deinem Model aendern. Du kannst das auch irgendwo zwischenspeichern und das spaeter machen, wenn du willst. Ich weiss jetzt nicht, wozu das gut sein sollte aber es geht.

    * Du kannst auch selber entscheiden, wann tableChanged ueberhaupt aufgerufen wird (fireTableCellUpdated(row, col); )

    lg, Benjamin Ferrari, bookworm.at

  • jimbeam
    11
    jimbeam
    Mitglied
    Reaktionen
    11
    Punkte
    1.201
    Beiträge
    204
    • 3. August 2006 um 10:42
    • #7

    bei mir kommt er nicht dahin:

    Code
    table.getModel().addTableModelListener(new TableModelListener() {
                public void tableChanged(TableModelEvent event) {
                  //System.out.println("DEBUG: " + rowData.get(event.getFirstRow()).get(event.getColumn()));
                    System.out.println("TEST");
                }
            });

    Auch wenn ich in der Spalte etwas eingebe kommt er nicht hinein!

    Paddys, hm.....

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 3. August 2006 um 11:07
    • #8

    Erst wenn du die Eingabe bestaetigst (ENTER taste oder auf eine andere Spalte klicken), wird das event gefeuert. Ansonsten muss es an einem Bug in deiner Javaversion liegen (1.5 hier) oder du hast an dem democode etwas entscheidendes geaendert, denn ich hab meinen Code natuerlich getestet bevor ich ihn gepostet habe.

    lg, Benjamin Ferrari, bookworm.at

  • jimbeam
    11
    jimbeam
    Mitglied
    Reaktionen
    11
    Punkte
    1.201
    Beiträge
    204
    • 3. August 2006 um 11:19
    • #9
    Code
    public class CMSTableModel extends AbstractTableModel{
    
        /** Creates a new instance of CMSTableModel */
        private Vector<User> user_vec = null;
    
        public CMSTableModel(Vector<User> u)
        {
            this.user_vec = u;
        }
    
        public Object getValueAt(int row,int column)
        {           
            User u = user_vec.get(row);
            switch(column)
            {   case 0: return u.getFn();
                case 1: return u.getLn();
                case 2: return u.getGvgid();
            }
            return null;
        }
    
        public int getRowCount() 
        {       
            return user_vec.size();
        }
    
        public int getColumnCount()
        {
            return 3;
        }
    
        public String getColumnName(int column)
        {
             switch(column)
            {   case 0: return new String("Vorname");
                case 1: return new String("Nachname");
                case 2: return new String("GvGID");
            }
            return null;
        }
    
        public boolean isCellEditable(int rowIndex,int columnIndex)
        {
            if(columnIndex == 2) {
                return true;
            }
            else {
                return false;
            }
        }
    
        public void setValueAt(Object aValue, int rowIndex, int columnIndex)
        {
            User u=this.user_vec.get(rowIndex);
            switch(columnIndex)
            {   
                case 0: u.setFn((String) aValue);
                case 1: u.setLn((String) aValue);
                case 2: u.setGvgid((String) aValue);          
            }
            fireTableCellUpdated(rowIndex, columnIndex);
        }   
    
    
    }
    Alles anzeigen


    Das ist mein TableModel

    Code
    TableModel tm = new CMSTableModel(u_vec);        
            cmstable.setModel(tm);     
            this.cms_scrollpane.setViewportView(cmstable);

    Und so wird die Tabelle angezeigT!

    Den Code vom Listener hab ich ja schon gepostet!
    Ein Bug in Java? Das wäre sehrsehr blöde!

    Paddys, hm.....

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 3. August 2006 um 11:54
    • #10

    Also ich hab jetzt meine demo so umgestaltet, das sie dein TableModel verwendet und hab nach wie vor keinerlei probleme (Ich bekomme die ausgabe "TEST", wenn ich einen wert in spalte 3 aendere.)

    Java
    /**File: JTableExample.java*/
    
    
    /**@Author: Benjamin Ferrari , 2006*/
    
    
    import java.util.Vector;
    
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
    
    
    class User{
    
      public User(String fn, String ln, String gvgid){
        setFn(fn);
        setLn(ln);
        setGvgid(gvgid);
      }
    
      private String fn;
      private String ln;
      private String gvgid;
      public final String getFn() {
        return fn;
      }
      public final void setFn(String fn) {
        this.fn = fn;
      }
      public final String getGvgid() {
        return gvgid;
      }
      public final void setGvgid(String gvgid) {
        this.gvgid = gvgid;
      }
      public final String getLn() {
        return ln;
      }
      public final void setLn(String ln) {
        this.ln = ln;
      }
    
    
    }
    
    
    class CMSTableModel extends AbstractTableModel{
    
    
      //eclipse wants me to do this, ignore
      private static final long serialVersionUID = 1L;
    
      /** Creates a new instance of CMSTableModel */
      private Vector<User> user_vec = null;
    
      public CMSTableModel(Vector<User> u)
      {
          this.user_vec = u;
      }
    
      public Object getValueAt(int row,int column)
      {           
          User u = user_vec.get(row);
          switch(column)
          {   case 0: return u.getFn();
              case 1: return u.getLn();
              case 2: return u.getGvgid();
          }
          return null;
      }
    
      public int getRowCount() 
      {       
          return user_vec.size();
      }
    
      public int getColumnCount()
      {
          return 3;
      }
    
      public String getColumnName(int column)
      {
           switch(column)
          {   case 0: return new String("Vorname");
              case 1: return new String("Nachname");
              case 2: return new String("GvGID");
          }
          return null;
      }
    
      public boolean isCellEditable(int rowIndex,int columnIndex)
      {
          if(columnIndex == 2) {
              return true;
          }
          else {
              return false;
          }
      }
    
      public void setValueAt(Object aValue, int rowIndex, int columnIndex)
      {
          User u=this.user_vec.get(rowIndex);
          switch(columnIndex)
          {   
              case 0: u.setFn((String) aValue);
              case 1: u.setLn((String) aValue);
              case 2: u.setGvgid((String) aValue);          
          }
          fireTableCellUpdated(rowIndex, columnIndex);
      }   
    
    
    }
    
    
    public class JTableExample extends JPanel {
    
    
      private static final long serialVersionUID = 1L;
    
    
      public JTableExample() {
        JTable table = createTable();
    
    
        // Hier der Code, in dem auf das aendern eines values reagiert wird.
        // Beachte auch, das du es die methoden event.getFirstRow() und
        // event.GetLastRow() gibt. Du kannst also auch die aenderungen von
        // mehreren zeilen gleichzeitig abfangen.
        table.getModel().addTableModelListener(new TableModelListener() {
    
    
          public void tableChanged(TableModelEvent event) {
            System.out.println("TEST");
          }
    
    
        });
    
    
        this.add(table);
    
    
      }
    
    
      private JTable createTable() {
        Vector<User> users = new Vector<User>();
    
    
        users.add(new User("fn1", "ln1", "gvgid1"));
        users.add(new User("fn2", "ln2", "gvgid2"));
        users.add(new User("fn3", "ln3", "gvgid3"));
    
    
        JTable table = new JTable();
    
        table.setModel(new CMSTableModel(users));
    
    
        return table;
    
    
      }
    
    
      public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JTableExample());
        frame.pack();
        frame.setVisible(true);
      }
    
    
    }
    Alles anzeigen

    UPDATE: Wenn diese Demo genau so bei Dir nicht funktioniert, poste doch bitte mal die Ausgabe von "java -version" hier. Bei mir ist das

    Code
    $ java -version
    java version "1.5.0_06"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-112)
    Java HotSpot(TM) Client VM (build 1.5.0_06-64, mixed mode, sharing)


    (auf Mac OSX)

    lg, Benjamin Ferrari, bookworm.at

  • jimbeam
    11
    jimbeam
    Mitglied
    Reaktionen
    11
    Punkte
    1.201
    Beiträge
    204
    • 3. August 2006 um 12:36
    • #11

    das Beispiel funktioniert!

    aber mein Programm nicht!

    Paddys, hm.....

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung