WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 19.09.2005, 14:22   #1
Frankster
Veteran
 
Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242


Standard JTable Aktualisierung ?

Ich schaff es nicht meine JTable zu aktualisieren.
Sie wird beim Start gefüllt und während der Laufzeit ändert sich der Inhalt der Hashmap, aber ich schaffe es nicht den Inhalt der JTable zu aktualisieren.

Bei der JTable kann sich die Zeilenanzahl verändern, die Spaltenanzahl bleibt immer gleich.

Ich möchte, dass sich die JTable komplett neu füllt und nicht nur Zeilen löscht oder hinzufügt.

Code:
import java.awt.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.*;
import java.util.*;

public class TimerDaten extends JFrame implements DBoxWatcherInterface {

    public TimerDaten() {
        MyTableModel x = new MyTableModel();
    }
    
    public void getHashmap(HashMap map) {
        //System.out.println("GetHashmap");
        this.map = map;
        x.tableUpdate();
    }

    class MyTableModel extends AbstractTableModel{
        private String[] spaltenNamen = {"Nr.", "Wdh.", "Start-Zeit","Stop-Zeit","Sender"};
        
        private Object[][] zeilen = new Object[map.size()][5];

        public MyTableModel(){
            Object[] zeilenKeys= map.keySet().toArray();
            for(int zeile=0; zeile<map.size(); zeile++){
                zeilen[zeile][0] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getEventId();
                zeilen[zeile][1] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getEventRepeat();
                zeilen[zeile][2] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getAlarmTime();
                zeilen[zeile][3] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getStopTime();
                zeilen[zeile][4] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getData();
            }
        }
        
        public void tableUpdate() {
            System.out.println("ICH BIN DA");
            fireTableDataChanged();
        }

             }
         }
    }
}
Mfg
Frankster
Frankster ist offline   Mit Zitat antworten
Alt 19.09.2005, 18:44   #2
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard Re: JTable Aktualisierung ?

Zitat:
Original geschrieben von Frankster

Ich möchte, dass sich die JTable komplett neu füllt und nicht nur Zeilen löscht oder hinzufügt.
Dann ist es wohl am einfachsten du erstellst sie neu: JTable myTable = new JTable(zeilen);

Du musst dann allerdings auch dafür sorgen das die neue Tabelle auch angezeigt wird (z.B. in einer JScrollPane sp mit sp.getViewport().add(myTable);

jak
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona)
Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing.
\"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra)
jak ist offline   Mit Zitat antworten
Alt 20.09.2005, 13:46   #3
Frankster
Veteran
 
Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242


Standard

Muss ich da vorher den alten contentPane() löschen ?

weil ich binde die neue Table in der Methode ein, aber es verändert sich nichts :-(
Frankster ist offline   Mit Zitat antworten
Alt 20.09.2005, 16:46   #4
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard

Ein .getContentPane().add(myTable) sollte es tun.
Eventuell noch ein .update() aufrufen.

Kennst du schon diese Seite: http://java.sun.com/docs/books/tutorial/uiswing/
besonders diese Unterseiten sind empfehlenswert:
http://java.sun.com/docs/books/tutor...onentlist.html
http://java.sun.com/docs/books/tutor...vents/api.html

jak
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona)
Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing.
\"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra)
jak ist offline   Mit Zitat antworten
Alt 20.09.2005, 22:32   #5
Frankster
Veteran
 
Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242


Standard

mit pack() erstellt er mir endlich ein neues aktualisiertes Frame.

und mit show() gehts auch
Frankster ist offline   Mit Zitat antworten
Alt 21.09.2005, 09:01   #6
Farkarich
Senior Member
 
Registriert seit: 19.09.2000
Alter: 40
Beiträge: 122


Farkarich eine Nachricht über ICQ schicken
Standard pack & show

Hi mal

Also ich würde dass nur im notfall mit pack und show machen, weil da wird ja viel mehr neu gemacht als nur das frame, und das geht ja auch die Performance...

Wann werden die Daten in der HashMap geändert??

da wirds ja irgendein Event geben oder??
bei dem Event würd ich einfach sagen Table.getModel().fireTableDataChanged()
(galub dass die methode so heisst) dass dann dürfts gehen
Farkarich ist offline   Mit Zitat antworten
Alt 21.09.2005, 12:51   #7
Frankster
Veteran
 
Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242


Standard

Das ganze Funkt so.
Alle 5 Sekunden werden in einer anderen Klasse (KLASSE B) Methoden aufgerufen und in einer Methode dieser KLASSE B ist der Interface-Aufruf. Dieses Interface ruft in der TIMERDATEN Klasse die Methode
public void getHashmap(HashMap map) auf und übergibt ihr die neue HashMap. Somit hat die TIMERDATEN Klasse die neue Hashmap und soll auch die JTable aktualisieren.

So sieht der komplette Code meiner GUI Klasse aus

Code:
package dboxwatcher2_0;

import java.awt.*;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.event.*;
import javax.swing.table.*;
import java.util.*;

/**
 * 

Überschrift: </p>
 *
 * 

Beschreibung: </p>
 *
 * 

Copyright: Copyright (c) 2005</p>
 *
 * 

Organisation: </p>
 *
 * @author unbekannt
 * @version 1.0
 */
public class TimerDaten extends JFrame implements DBoxWatcherInterface  {
    FlowLayout borderLayout1 = new FlowLayout();
    HashMap map = new HashMap();
    JTable timerTable;
    DBox getMap = new DBox();
    MyTableModel x;
    TableSorter sorter;
    JScrollPane scrollPane;
    JButton button1 = new JButton("Klick mich");

    public TimerDaten() {
        try {
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    private void jbInit() throws Exception {
        this.map = getMap.map;


        x = new MyTableModel();
        sorter = new TableSorter(new MyTableModel());
        timerTable = new JTable(sorter);
        sorter.setTableHeader(timerTable.getTableHeader());
        sorter.setSortingStatus(0,1);
        timerTable.setPreferredScrollableViewportSize(new Dimension(500, 70));
        scrollPane = new JScrollPane(timerTable);
        getContentPane().setLayout(new FlowLayout());
        this.getContentPane().add(scrollPane);
        x.spaltenBreite();

    }

    public void getHashmap(HashMap map2) {
        this.map = map2;
        x.tableUpdate();
    }

    class MyTableModel extends AbstractTableModel{
        private String[] spaltenNamen = {"Nr.", "Wdh.", "Start-Zeit","Stop-Zeit","Sender"};
        private Object[][] zeilen;
        public MyTableModel(){
            zeilen = new Object[map.size()][5];
            Object[] zeilenKeys= map.keySet().toArray();
            for(int zeile=0; zeile<map.size(); zeile++){
                zeilen[zeile][0] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getEventId();
                zeilen[zeile][1] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getEventRepeat();
                zeilen[zeile][2] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getAlarmTime();
                zeilen[zeile][3] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getStopTime();
                zeilen[zeile][4] = ((DboxTimerDaten)(map.get(zeilenKeys[zeile]))).getData();
            }
        }

        public int getColumnCount() {
            //System.out.println("Spalten" + spaltenNamen.length);
            return spaltenNamen.length;
        }

        public void tableUpdate() {
            sorter.fireTableDataChanged();
            fireTableDataChanged();
            ((AbstractTableModel)timerTable.getModel()).fireTableDataChanged();
            fireTableStructureChanged();
            System.out.println(timerTable.getModel());
            repaint();
        }

        public int getRowCount() {
            //System.out.println("Zeilen" + zeilen.length);
            return zeilen.length;
        }

        public String getColumnName(int col) {
            //System.out.println(spaltenNamen[col]);
            return spaltenNamen[col];
        }

        public Object getValueAt(int row, int col) {
            this.zeilen = new Object[map.size()][5];
            Object[] zeilenKeys = map.keySet().toArray();
            for (int zeile = 0; zeile < map.size(); zeile++) {
                zeilen[zeile][0] = ((DboxTimerDaten) (map.get(zeilenKeys[zeile]))).
                                   getEventId();
                zeilen[zeile][1] = ((DboxTimerDaten) (map.get(zeilenKeys[zeile]))).
                                   getEventRepeat();
                zeilen[zeile][2] = ((DboxTimerDaten) (map.get(zeilenKeys[zeile]))).
                                   getAlarmTime();
                zeilen[zeile][3] = ((DboxTimerDaten) (map.get(zeilenKeys[zeile]))).
                                   getStopTime();
                zeilen[zeile][4] = ((DboxTimerDaten) (map.get(zeilenKeys[zeile]))).
                                   getData();
            }
            return zeilen[row][col];
        }

        public void spaltenBreite() {
            TableColumn column = null;
            for (int i = 0; i < getColumnCount(); i++) {
                column = timerTable.getColumnModel().getColumn(i);
                if (i == 0) {
                     column.setPreferredWidth(40);
                     column.setMaxWidth(50);
                     column.setMinWidth(25);
                 }
                 if (i==1) {
                     column.setPreferredWidth(40);
                     column.setMaxWidth(50);
                     column.setMinWidth(25);

                 }
             }
         }
    }
}
Frankster ist offline   Mit Zitat antworten
Alt 21.09.2005, 23:28   #8
Frankster
Veteran
 
Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242


Standard

OK!
ich hab den int getRowCount() nicht mit der HashMap in Verbindung gebracht, dadurch hat sich die Zeilenanzahl nicht aktualisiert.

Nur warum zum Teufel aktualisiert sich die Table wenn ich auf einen Button klicke und nicht wenn die Methode über das Interface aufgerufen wird.
Was macht der ActionListener anders als meine InterfacMethode ?

Code:
    public void actionPerformed(ActionEvent evt) {
        this.map = getMap.map;
        System.out.println("MAP:" + map.size() + map);
        x.tableUpdate();
    }
    
    public void getHashmap(HashMap map2) {
        this.map = getMap.map;
        System.out.println("MAP:" + map.size() + map);
        x.tableUpdate();
    }
actionPerformed() wird natürlich aufgerufen wenn ich auf einen Button klicke. DIe Map wird eingelesen und die JTable übernimmt die neuen Daten

getHashmap() wird von einer anderen Klasse alle 5 Sekunden über ein Interface aufgerufen.
Sie muss doch das gleiche machen wie so ein blöder Buttonklick. Es steht doch haargenau das selbe drinnen.

Ich versteh das ned, ich dreh noch durch
Frankster ist offline   Mit Zitat antworten
Alt 22.09.2005, 00:02   #9
Frankster
Veteran
 
Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242


Standard

Verwende ich die Funktion des Interface richtig ?

Code:
public interface DBoxWatcherInterface {

    public void getHashmap(HashMap map);
}
Die Klasse B wird alle 5 Sekunden aufgrufen und ruft natürlich auch die Methode des Interfaces auf:

Code:
public class B {
   DBoxWatcherInterface obj;
   public B(){
      obj = new TimerDaten(); // meine GUI Klasse
    }
    public void setTimer(){
       obj.getHashmap(map);
    }
}
Und weiter oben wird eh erklärt wie die TimerDaten Klasse die getHashmap() Methode ausprogrammiert
Frankster ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:48 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag