eigenes Actionevent

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi Leute,

folgende Situation: Ich hab eine GUI-Anwendung geschrieben, welche einen ConnectButton besitzt, wenn dieser gedrückt wird, dann wird in einer Geräteklasse eine Connect Methode aufgerufen. Das ganze ist nach dem MVC Prinzip realisiert und funktioniert auch. Jetzt möchte ich aber dass die Connectmethode in eine Textarea Log-Infos schreiben kann. Ich möchte der Methode nicht einfach eine Referenz auf das Feldübergeben. Muss ich jetzt ein eignes Event+Listener erzeugen um den Controller die Infos in das Feld schrieben zu lassen? Wie würde sowas aussehen.

So sieht es bisher aus:

Code:
public class Bridge {
	

	public static void main(String[] args) {
		SerialComm serialComm = new SerialComm(); // Model
		BridgeGUI bridgeGUI = new BridgeGUI();    // View
		BridgeController bridgeController = new BridgeController(serialComm,bridgeGUI);
		bridgeGUI.setVisible(true);
		
	}
}



// =================== View

import java.awt.BorderLayout;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;




public class BridgeGUI extends JFrame{
	
	private JTextArea 	m_LogField     = new JTextArea("",15,30);
    private JButton    	m_ConnectButton = new JButton("Connect");
	
    BridgeGUI() {
    JPanel content = new JPanel();
    content.setLayout(new BorderLayout());
    content.add(m_LogField, BorderLayout.CENTER);
    content.add(m_ConnectButton, BorderLayout.SOUTH);
    this.setContentPane(content);
    this.pack();
	}
	
	void addConnectListener(ActionListener cal) {
		m_ConnectButton.addActionListener(cal);
		
	}
}

// =================Model


import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;


import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;



public class SerialComm {
	private Enumeration portList;
	private CommPortIdentifier portIdentifier;

	public InputStream in;
	public OutputStream out;
	public Boolean M500Found;
	public Thread listenThread;
	

	public SerialComm() {
		
	}

	void connect() throws Exception {
		M500Found = false;
		portList = CommPortIdentifier.getPortIdentifiers();
		
		
//		log.append("Scanning Ports:\n");
		while (portList.hasMoreElements() && !M500Found) {
			try {
				portIdentifier = (CommPortIdentifier) portList.nextElement();
				if (portIdentifier.getPortType() == CommPortIdentifier.PORT_SERIAL) {
//					log.append(portIdentifier.getName() + "...\n");

					if (portIdentifier.isCurrentlyOwned()) {
						System.out.println("Error: Port is currently in use");
//						log.append("Error: Port is currently in use\n");
					} else {
						CommPort commPort = portIdentifier.open(this.getClass()
								.getName(), 2000);

						if (commPort instanceof SerialPort) {
							SerialPort serialPort = (SerialPort) commPort;
							serialPort.setSerialPortParams(115200,
									SerialPort.DATABITS_8,
									SerialPort.STOPBITS_1,
									SerialPort.PARITY_NONE);

							in = serialPort.getInputStream();
							out = serialPort.getOutputStream();

							listenThread = new Thread(new SerialReader(in));
							listenThread.start();
							out.write("M500, bist du es?".getBytes());
							Thread.sleep(2000);
							listenThread.stop();

							commPort.close();

						}
					}
				}
			} catch (Exception e) {

				e.printStackTrace();
			}
		}
	}

	/** */
	public class SerialReader implements Runnable {
		InputStream in;

		public SerialReader(InputStream in) {
			this.in = in;

		}

		public void run() {
			byte[] buffer = new byte[1024];
			int len = -1;
			try {
				len = this.in.read(buffer);
				if ((new String(buffer, 0, len)).equals("M500, bist du es?")) {

					M500Found = true;
//					log.append("M500 found.\n");
				}

			} catch (Exception e) {

				e.printStackTrace();
			}
		}
	}

}


// =================== Controller


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class BridgeController {
	private final SerialComm m_serialComm;
	private BridgeGUI m_bridgeGUI;

	BridgeController(SerialComm serialComm, BridgeGUI bridgeGUI) {
		m_serialComm = serialComm;
		m_bridgeGUI = bridgeGUI;
		bridgeGUI.addConnectListener(new ConnectListener());
	}

	class ConnectListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			try {
				m_serialComm.connect();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}

	}

}
 
G

Guest

Gast
Vielen Dank für den Tipp, ich hab es so gemacht und es funktioniert auch, allerdings ist das ganze sehr träge und langsam. Die Einträge in mein Logfeld werden erst dann übernommen, wenn meine connect() Methode komplett durchgelaufen ist, woran liegt das?

Sollte doch so richtig umgesetzt sein oder?
Code:
// Model
public class SerialComm extends Observable {


	void writeLog(String s) {
		setChanged();
		notifyObservers(s+"\n");
	}

	void connect() throws Exception {
		M500Found = false;
		portList = CommPortIdentifier.getPortIdentifiers();
		writeLog("Scaning ports:");
		System.out.println("Scanning ports");
}
}

// View
public class BridgeGUI extends JFrame implements Observer {

	private JTextArea m_LogField = new JTextArea("", 15, 30);
	
	
	public void update(Observable o, Object arg) {
		m_LogField.append(arg.toString());
	}
}

// Controller
public class BridgeController {
	private final SerialComm m_serialComm;
	private BridgeGUI m_bridgeGUI;

	BridgeController(SerialComm serialComm, BridgeGUI bridgeGUI) {
		m_serialComm = serialComm;
		m_bridgeGUI = bridgeGUI;
		
		bridgeGUI.addConnectListener(new ConnectListener());
		m_serialComm.addObserver(m_bridgeGUI);
	}

	class ConnectListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			try {
				m_serialComm.connect();
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}

	}

}
 
S

SlaterB

Gast
solange der ActionListener läuft, ist die restliche GUI blockiert, das hat nix mit dem eigenen Observer zu tun,

du musst die Aktion des ActionListeners in einem Thread nebenläufig ausführen
 

thE_29

Top Contributor
Oder Foxtrot nehmen!

Such im Board danach! Ich verwende nur noch foxtrot ;) (eventuell gehts auch mit der SwingWorker!)
 

Marco13

Top Contributor
Hm - bevor man eine fremd-JAR verwendet, sollte man sich IMHO schon fragen: Gibt's da nicht was von Ratio..sun? Ein eigener Thread oder SwingWorker würde es hier wohl tun. SwingWorker braucht ggf. etwas mehr Einarbeitung, erledigt aber auch gleich das "Veröffentlichen" der Logdaten im EDT (was man sonst wiederum "per Hand" mit SwingUtilities machen müßte)
 

thE_29

Top Contributor
Najo, foxtrot kannst du dir auch den Source anschaun!

So viel ist das gar nicht! Es ist einfach gut umgesetzt ;)
 
G

Gast

Gast
danke für die Antworten, ich werde mir mal Swinkworker anschauen, wenn ich noch Fragen dazu habe, kommen sie hier rein ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
S Eclipse Github Projekt in eigenes Projekt einbinden und nutzen Allgemeine Java-Themen 13
B eigenes Consumer Interface Allgemeine Java-Themen 0
Thallius Eigenes Message Center erstellen Allgemeine Java-Themen 3
M eigenes Seekarten-Tool (oder PlugIn?) Allgemeine Java-Themen 2
Z LanguageTool in eigenes GUI einbetten Allgemeine Java-Themen 0
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
O log4j - eigenes Log für einzelne Klasse Allgemeine Java-Themen 5
M Eigenes Eventsystem Allgemeine Java-Themen 2
T Code durch eigenes Frame pausieren (ähnlich JDialog) Allgemeine Java-Themen 4
J Swing Eigenes Button-design Allgemeine Java-Themen 2
S import meine.eigenes.import Allgemeine Java-Themen 6
I Eigenes Mail-Programm schreiben Allgemeine Java-Themen 21
N eigenes Bildformat Allgemeine Java-Themen 2
J Eigenes Produkt Upgrade / Update-fähig halten? Allgemeine Java-Themen 16
M Erstes eigenes Projekt Allgemeine Java-Themen 5
D Simples eigenes Logfile Allgemeine Java-Themen 18
J Eigenes Objekt sichern Allgemeine Java-Themen 9
R Eigenes Objekt - clone() Allgemeine Java-Themen 2
G eigenes ChangeEvent Allgemeine Java-Themen 4
P Installationsroutine für eigenes Java-Programm Allgemeine Java-Themen 3
M Eigenes Java-Server-Programm unter Linux steuern? Allgemeine Java-Themen 13
G eigenes dateiformat als zip Allgemeine Java-Themen 2
M Eigenes Synchronisationstool? Allgemeine Java-Themen 2
E Wie: Eigener Listener, eigenes Event (möglichst einfach) Allgemeine Java-Themen 29
ToNyXXL Als Mauszeiger eigenes Bild verwenden! Allgemeine Java-Themen 3
S eigenes Zahlensystem? Allgemeine Java-Themen 5
K Eigenes Protokoll (abc:[url]http://abc.de[/url]) Allgemeine Java-Themen 2
A Eigenes jar file in projekt einbinden Allgemeine Java-Themen 4
B eigenes look and feel Allgemeine Java-Themen 11
K eigenes Tool jar - maskieren der Methoden Allgemeine Java-Themen 3
T eigenes Browser Plugin Allgemeine Java-Themen 6
T Eigenes Installationsprogramm Allgemeine Java-Themen 17
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
M Event Handling Vom ActionEvent zum Parent-Namen Allgemeine Java-Themen 11
J Problem mit ActionEvent / JMenu Allgemeine Java-Themen 4
I ActionEvent Allgemeine Java-Themen 8
N while Schlauf und ActionEvent Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben