observer

Status
Nicht offen für weitere Antworten.

nibblas

Aktives Mitglied
moin

ich möchte mein gui über änderungen der verarbeitenden klasse informieren.

dazu möchte ich die observer design pattern einsetzen.
ich habe mir die FAQ zu observer hier im forum gelesen und probiert das ganze zu implementieren.

hier meine 3 klassen.

Rfid_read oberservable
Code:
public class Rfid_read extends Observable {

	private Timer Read = new Timer( 250, new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { try {
		jReadTimer();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} } } );
	
	
	//Geräte beziehen
	public String jReadTimer() throws SQLException
	{
		TMedioLx00BufferEntry myTag = new TMedioLx00BufferEntry(); //null;
		boolean boContinue = false;
		String taginfo = null;
		int iMaxScans = 1;
		
		 		
		// While there are tags in reader's buffer
		while( iMaxScans-- != 0 )
		{
			try
			{
				boContinue = lx00Reader.getBufferEntry(
														true,	// Do not clear reader buffer after tag id extraction
														myTag	// MedioLx00Tag object
														);
			}
			catch( TSTXeErrorException e )
			{
				Read.stop();
				 
			}
										  		
			if( !boContinue )
				break;
			
//			System.out.println(myTag.getTagTypeAsString());
//			System.out.println(myTag.getChannelAsString());
//			System.out.println(myTag.getDataAsString());
			
			Toolkit.getDefaultToolkit().beep();
			taginfo = myTag.getDataAsString();
			Read.stop();
		}
		setChanged();
		notifyObservers(taginfo);
		return taginfo;
	}   
	//---------------------------------------------------------------
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		
		

	}

}

hier der observer das GUI

Code:
public class MatisseGui extends javax.swing.JFrame implements Observer {

	
	private String rfidtag = null;

	public MatisseGui() throws ClassNotFoundException, SQLException {
		initComponents();
	}


	private void initComponents() {


              //alle gui komponente

		
		pack();
	}// </editor-fold>
	//GEN-END:initComponents

	 */
	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					new MatisseGui().setVisible(true);
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}

	
	public void update(Observable o, Object arg) {
		// TODO Auto-generated method stub
		this.setRfidtag(arg.toString());
		this.textDeviceid.setText(arg.toString());
	}

}

und die controller klasse

Code:
public class GuiController {

	/**
	 * @param args
	 * @throws SQLException 
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		MatisseGui test = new MatisseGui();
		Rfid_read read = new Rfid_read();
		read.addObserver(test);
		

	}

}


hmm scheint aber noch net korrekt zu sein.. was mache ich falsch??

gruss nibblas
 
ach so ihr könnt mit meiner fehler beschreibung nix anfangen....

sorry jungs 😳

das problem ist folgendes dass die Rfid_read klasse daten aus dem puffer des RFID Lesegerätes ausliest, um diese daaten in das gui zu bekommen habe ich das observe pattern als lösung gesehen und probiert das zu implementieren...

nur wird die Update methode gar nie aufgerufen....

muss ich ein objekt von der klasse GuiController instanzieren?
hab da den durchblick noch net....

die Rfid klasse denke ich ist das setChanged() und notify korrekt implementiert... im gui ist die methode Update ebenfalls korrekt enhalten.... müsste das problem beim controller liegen...
 
also bei dir fehlt definitiv das setzten der "dirty flag" für den Observerable. (setChanged()😉

Was sonst noch nicht geht ist etwas schwer zu definieren, da dein Code nicht kommentiert und voll mit überflüssigem Zeug ist.

Hoffe es hilft dennoch
 
doch die methode an sich wird aufgerufen... die daten vom RFID lesegerät werden übertragen und der beep wird auch ausgegeben...

ich habe zu testzwecken in der update methode eine system.print eingebaut... die update methode wird wohl gar nicht aufgerufen...
 
Ja, da das jetzt keiner Testen kann (und ich versichere dir: Jedes KSKB/Tesprogramm, dass jetzt irgendjemand hier posten könnte, würde funktionieren) bleibt dir wohl nichts anderes als Debug-Ausgaben. In der jReadTimer-Methode am Anfang
System.out.println("Fange an");
und am Ende

System.out.println("Notifye "+countObservers()+" observer");
setChanged();
notifyObservers(taginfo);

.. usw.
 
keine observer... 0...

liegt das problem daran dass ich im gui zu beginn bereits eine instanz der Rfid_read klasse erstelle? der observer obvserviert ja dabei das objekt read.

da ich im gui über einen action event eines buttons die read funktion aufrufe, benötige ich ja schon ein objekt der rfid klasse...


hier mein gekürzte gui klasse.

Code:
package Observer;

import java.util.Observable;
import java.util.Observer;

import com.tagsys.protocol.stxe.TSTXeErrorException;

/**
 *
 * @author  __USER__
 */
public class minigui extends javax.swing.JFrame implements Observer {

	/**
	 * 
	 */
	
	private final Rfid_read Read = new Rfid_read();
	
	
	private static final long serialVersionUID = 1L;

	/** Creates new form minigui */
	public minigui() {
		initComponents();
	}

	/** This method is called from within the constructor to
	 * initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is
	 * always regenerated by the Form Editor.
	 */
	//GEN-BEGIN:initComponents
	// <editor-fold defaultstate="collapsed" desc="Generated Code">
	private void initComponents() {

		jTextField1 = new javax.swing.JTextField();
		jButton1 = new javax.swing.JButton();

		setDefaultCloseOperation(3);

		jTextField1.setText("jTextField1");

		jButton1.setText("jButton1");
		jButton1.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton1ActionPerformed(evt);
			}
		});

		org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(
				getContentPane());
		getContentPane().setLayout(layout);
		layout
				.setHorizontalGroup(layout
						.createParallelGroup(
								org.jdesktop.layout.GroupLayout.LEADING)
						.add(
								layout
										.createSequentialGroup()
										.add(75, 75, 75)
										.add(
												layout
														.createParallelGroup(
																org.jdesktop.layout.GroupLayout.LEADING)
														.add(jButton1)
														.add(
																jTextField1,
																org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
																187,
																org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
										.addContainerGap(138, Short.MAX_VALUE)));
		layout.setVerticalGroup(layout.createParallelGroup(
				org.jdesktop.layout.GroupLayout.LEADING).add(
				layout.createSequentialGroup().add(66, 66, 66).add(jTextField1,
						org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 74,
						org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).add(41,
						41, 41).add(jButton1).addContainerGap(96,
						Short.MAX_VALUE)));

		pack();
	}// </editor-fold>
	//GEN-END:initComponents

	private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		try {
			Read.ConnectReader();
		} catch (TSTXeErrorException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			Read.startRead();
		} catch (TSTXeErrorException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * @param args the command line arguments
	 */
	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				new minigui().setVisible(true);
			}
		});
	}

	//GEN-BEGIN:variables
	// Variables declaration - do not modify
	private javax.swing.JButton jButton1;
	private javax.swing.JTextField jTextField1;

	// End of variables declaration//GEN-END:variables

	public void update(Observable arg0, Object arg1) {
		System.out.println("jap es geht");

	}

}
 
Hm. Noch ein paar Posts, und das chaos ist komplett. Wo liegt dann nun die Instanz, die observiert werden soll? Im GUI oder im Controller? Was macht die Methode startRead? ... Poste ein kleines Beispiel, das COMPILERBAR und LAUFFÄHIG ist, und das nicht funktioniert (für den ganzen RFID-Lese-Mist kannst du "Leere" Dummy-Methoden einbauen). Du kannst davon ausgehen, dass die erste Antwort, die du dann erhältst, das Problem löst.
 
hat sich schon gelöst... mal ein wenig an die frische luft und den kopf frei bekommen.. hab da ein riesen stuss abgelassen....

klart hats net funktioniert... ich hab auch das falsche objekt observiert gehabt...
geht nun...

thx trotzdem
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben