Swing Tabelle

chett

Grünschnabel
Ein herzliches Hallo...
hier seht ihr nun mein erstes Java Prgramm, dass mir auch gleich kräftig Nerven kostet!!
Kurz zu meiner Situation:
Das ganze stellt eine Tabelle die mit Objecten gefüllt werden soll.
Jede sekunde wird die Funktion "doAction" aussgeführt, welche mich mit den aktuellen Daten versorgt. (Daten kommen als Vector und werden dann meinen variablen zugewiesen)
Mein plan war also, in der "for (int i=0; i<alarmliste.size();i++)" Schleife alle Infos auszulesen und in die Tabelle zu speichern.
Allerdings bleibt bei mir immer nur die erste zeile der Spalte stehen (mit 0ern) :-(
Wie kann ich swing dazu bringen die Tabelle mit den werten neu zu zeichnen?
Scheinbar funktioniert es nicht mit repaint()

Code:
public AlarmListApplet() {
		setLayout(new BorderLayout());
		Panel titel = new Panel();
		titel.add((labelTitel = new JLabel("Alarmliste")));
		add("North", titel);	
//------Tabelle ---
		tabelle = new JTable(new MyTableModel()); 
//------tabelle.setModel(tm);
		JScrollPane scrollPane = new JScrollPane(tabelle);
		tabelle.setPreferredScrollableViewportSize(new Dimension(500, 200));
		tabelle.getTableHeader().setReorderingAllowed(false);
    	tabelle.getTableHeader().setResizingAllowed(false);
		tabelle.getColumn("zugewiesen").setMinWidth(0);
		tabelle.getColumn("zugewiesen").setMaxWidth(0);
		Panel test = new Panel();
		test.add(tabelle.getTableHeader());
		test.add(scrollPane);
		add("Center",test); 
//------Tabelle ende ---
    
//------Panel für die AlarmButtons (Sueden)
		Panel sueden = new Panel();
		sueden.setLayout(new GridLayout(1,0));
//------Buttons für das zugehörige Panel werden erstellt
		loeschen = new JButton("Löschen");
		sueden.add(loeschen);
		loeschen.addActionListener(this);
		uebertragen = new JButton("Übertragen");
		sueden.add(uebertragen);
		uebertragen.addActionListener(this);
		zurueck= new JButton("Zurückgeben");
		sueden.add(zurueck);
		zurueck.addActionListener(this);
		add("South", sueden);
	}
	class MyTableModel extends AbstractTableModel //implements TableModelListener 
	{
		private static final long serialVersionUID = 1L;
		private String[] columnNames = {"Action","AlarmID", "SensorID", "Uhrzeit", "zugewiesen"};
		private Object[][] data = {{new Boolean(true), alarmID, sensorID, timeStamp, "1"}};

			public int getColumnCount() {
		      return columnNames.length;
		    	}
			public int getRowCount() {
		      return data.length;
		    	}
		    public String getColumnName(int col) {
		      return (String)columnNames[col];
		    	}
		    public Object getValueAt(int row, int col) {
		      return data[row][col];
		    	}
		    public Class getColumnClass(int c) {
		        return getValueAt(0, c).getClass();
		    	}
//---Setzt Tabelle auf nicht editierbar; außer die Checkboxen...	      
		    public boolean isCellEditable(int row, int col) {
		    	return col==0;
		    	}
		    public void ActionPerformed(ActionEvent event){
		    	if (event.getSource() == loeschen)
		    	{
		    		setVisible(false);
		    		System.exit(0);
		    		}
		    	if (event.getSource()== zurueck)System.exit(0);
		    	else System.exit(0);
		    }
			public void init() { 
				AlarmListApplet ma = new AlarmListApplet();
				setSize(500,200);
				}
//	public void tableChanged(TableModelEvent e) {
//		// TODO Auto-generated method stub
//		
//		}
	}
	public void doAction(){
		try {				
			if (servletName==null || servletName.length()==0)return;
			URL servlet = new URL( servletName);
			AppletRequest newReq = new AppletRequest();
			newReq.setRequestType(RequestType.ALARMLISTE);
			Serializable objs[] = {newReq};
			ObjectInputStream inStream = postObjects( servlet, objs);
			Hashtable data = (Hashtable)inStream.readObject();
			Vector vec = (Vector)data.get("alarmListe");
			setAlarmliste(vec);
			inStream.close();
		} catch (Exception e) {e.printStackTrace();}
		for (int i=0; i<alarmliste.size();i++)
		{		
			int j=1;
			AlarmInfo alarm= (AlarmInfo)alarmliste.get(i);
			alarmID=alarm.getAlarmID();
			tabelle.setValueAt(alarmID, i , j);
			j++;
			AlarmInfo alarm2 = (AlarmInfo)alarmliste.get(i);
			sensorID=alarm2.getTrack().getTrack()[0].getSensorID();
			tabelle.setValueAt(sensorID, i, j);
			j++;
			AlarmInfo alarm3 = (AlarmInfo)alarmliste.get(i);
			timeStamp=alarm3.getTrack().getTrack()[0].getTimeStamp();
			tabelle.setValueAt(timeStamp, i, j);
			j++;	
			tabelle.repaint();
			tabelle.revalidate();
		}
		
		
	}
//	public void setValueAt(Object val, int row, int col) {
//		 fireTableCellUpdated(row, col);
//		 data[row][col]=val;
//		 }      
		
	protected void readParameterForInit() {
		servletName = getParameter("servletName");
		setDelay(1000);
		}
	public void setAlarmliste(Vector vector) {
		alarmliste = vector;
		}
//	public void fireTableCellUpdated(int row, int column) { 
//		  tm.fireTableDataChanged();
//		}
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}
	public void windowActivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	public void windowClosed(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	public void windowClosing(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	public void windowOpened(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
}

Irgendwelche Ideen?
Danke, der Javadepp
 
Moin!
Hab nun nicht so großartig auf den Quellcode geguckt.. aber soweit ich sehen kann, rufst du nie die Methode fireTableDataChanged() deines Models auf..
Musst du aber, damit die Tabelle neu gezeichnet wird...
Werden andere Operationen, wie zum Beispiel neue Spalten, ausgeführt, muss eine dementsprechende "fire" Methode aufgerufen werden...

*grüssle*
MeinerEiner

 
Danke für den Tip,
das scheint die funktion zu sein, die ich gesucht habe;

Nur um sicher zu gehen;
der funktion fireTableDataChanged() muss ich nicht mal was übergeben, richtig?

Leider kann ich sie im Moment nicht testen, da der Server gerade down ist und ich keine daten bekomme...
Werd's später noch mal probieren
 
So weit so gut,
dank der Fkt fireTableDataChange() wird die Tabelle neu gezeichnet (bei genauem hinsehen sieht man's) allerdings bleiben mein Tabellen Einträge leer;
scheinbar läuft also bei der wert übergabde was schief...
 
Zurück