![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Veteran
![]() Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242
|
![]() 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(); } } } } } Frankster |
![]() |
![]() |
![]() |
#2 | |
Inventar
![]() Registriert seit: 13.06.2001
Beiträge: 1.830
|
![]() Zitat:
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) |
|
![]() |
![]() |
![]() |
#3 |
Veteran
![]() Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242
|
![]() 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 :-( |
![]() |
![]() |
![]() |
#4 |
Inventar
![]() Registriert seit: 13.06.2001
Beiträge: 1.830
|
![]() 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) |
![]() |
![]() |
![]() |
#5 |
Veteran
![]() Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242
|
![]() mit pack() erstellt er mir endlich ein neues aktualisiertes Frame.
und mit show() gehts auch ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
![]() |
![]() 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 |
![]() |
![]() |
![]() |
#7 |
Veteran
![]() Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242
|
![]() 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); } } } } } |
![]() |
![]() |
![]() |
#8 |
Veteran
![]() Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242
|
![]() 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(); } 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 ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#9 |
Veteran
![]() Registriert seit: 13.07.2002
Alter: 44
Beiträge: 242
|
![]() Verwende ich die Funktion des Interface richtig ?
Code:
public interface DBoxWatcherInterface { public void getHashmap(HashMap map); } Code:
public class B { DBoxWatcherInterface obj; public B(){ obj = new TimerDaten(); // meine GUI Klasse } public void setTimer(){ obj.getHashmap(map); } } |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|