ich habe eine klasse client, welche mit einer server kommuniziert. innerhalb der klasse client habe ich einen thread, der mir einen event ausgeben würde. aber ich weiß nicht wie man event mit parameter schmeißt
Announcement
Collapse
No announcement yet.
Event mit parater ausgeben
Collapse
X
-
Hier ist meine Code ich möchte einfach innerhalb mein thread bei =>ToDo wenn neues erreignis auftritt rausschmeischen mit den entsprechenden Parameter(hier attribute der Klasse)
class MessageThread implements Runnable
{
public boolean stopThread =false;
public String StatusColor;
public boolean Palettfull;
public boolean UserHelpRequired;
public String WorkplanName;
public String WorkplanStatus;
public double WorkplanTime;
public int PartsTransported;
public int PartsNotGripped;
private Socket s;
private Document StatusInfo;
private byte[] buffer = new byte[1024]; // Buffer for receiving messages
// Constructor
public MessageThread (String IpAdress, int Port) throws UnknownHostException, IOException, InterruptedException, SAXException, ParserConfigurationException, TransformerException
{
// Initilisation of the socket to the server
s = new Socket(IpAdress, Port);
}
// Runnable interface method
public void run()
{
while (!stopThread)
{
try
{
// 1. Get the data
Get_StatusInfo();
// 2. Throw an event with the new data
// => ToDo
// 3. Sleep for 500ms
Thread.sleep(500);
}
catch (Exception e)
{
System.out.println("Error in communication with the server");
stopThread =true;
}
}
// Closing the socket
try
{
s.close();
}
catch (IOException e)
{
System.out.println("Error on closing the communication socket");
stopThread =true;
}
}
// Getting the Data from the Server
public void Get_StatusInfo() throws IOException, InterruptedException, SAXException, ParserConfigurationException, TransformerException
{
// Sending an Status Request to the Server
String tempstring = "StatusRequest";
OutputStream outstream = s.getOutputStream();
outstream.write(tempstring.getBytes(), 0, tempstring.length());
outstream.flush();
try {
// Waiting for data from the server
InputStream inpstr = s.getInputStream();
int bytesread =inpstr.read(buffer, 0, buffer.length);
tempstring = new String(buffer,0,bytesread);
if ((!tempstring.equals("Invalid!")) &&
tempstring.length()> 0) {
// Converting the string message to an xml Document
StatusInfo = stringToDom(tempstring);
// Getting the data out of the received xml Document
xmlToVars(StatusInfo);
}
else {
// Hanndling wrong messages from the server
System.out.print("Error: Invalid message received.");
}
}
catch (IOException e)
{
System.out.print("Error");
stopThread =true;
}
}
// Converting the received string message to an xml Document
private static Document stringToDom(String xmlSource) throws SAXException, ParserConfigurationException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
StringReader sr = new StringReader(xmlSource);
InputSource inSource = new InputSource(sr);
Document tempdoc = builder.parse(inSource);
return tempdoc;
}
// Converting the received xml Document to Data
private void xmlToVars(Document xmlsource){
Element docEle = xmlsource.getDocumentElement();
NodeList nList = docEle.getChildNodes();
for ( int i =0; i < nList.getLength(); i++){
Node nTemp = nList.item(i);
if (nTemp.getNodeName().equals("Status")){
StatusColor = nTemp.getAttributes().getNamedItem("Colour").getNo deValue();
UserHelpRequired = Boolean.parseBoolean(nTemp.getAttributes().getName dItem("UserRequired").getNodeValue());
}
else if (nTemp.getNodeName().equals("WorkPlan")){
WorkplanName = nTemp.getAttributes().getNamedItem("Name").getNode Value();
WorkplanStatus = nTemp.getAttributes().getNamedItem("Status").getNo deValue();
WorkplanTime = Double.parseDouble(nTemp.getAttributes().getNamedI tem("WorkTime").getNodeValue());
}
else if (nTemp.getNodeName().equals("Parts")){
PartsTransported = Integer.parseInt(nTemp.getAttributes().getNamedIte m("Transported").getNodeValue());
PartsNotGripped = Integer.parseInt(nTemp.getAttributes().getNamedIte m("NotGripped").getNodeValue());
}
else if (nTemp.getNodeName().equals("Palette")){
Palettfull = Boolean.parseBoolean(nTemp.getAttributes().getName dItem("Full").getNodeValue());
}
}
//printing for testing/debugging
System.out.print("\nStatus: " + StatusColor + "\n");
System.out.print("UserRequired?: " + UserHelpRequired + "\n");
System.out.print("Work Plan Name: " + WorkplanName + "\n");
System.out.print("Work Plan Status: " + WorkplanStatus + "\n");
System.out.print("Work plan Time: " + WorkplanTime + "\n");
System.out.print("Parts Transported: " + PartsTransported + "\n");
System.out.print("Parts Not Gripped: " + PartsNotGripped + "\n");
System.out.print("Palett full?: " + Palettfull + "\n");
}
}
Comment
-
unformatiert schaue ich mir das nicht genauer an
abgesehen davon nutze PropertyChangeListener
http://docs.oracle.com/javase/tutori...elistener.html
http://openbook.galileocomputing.de/...el_10_003.htmlChristian
Comment
-
Vlt haben Sie meine Frage nicht richtig bekommen
ich habe eine Klasse Client instanziert. Da die klasse alle 500ms die Klasse Server abfragt, um seine Attributen zu aktualisieren, möchte ich aktiv von dieser klasse benachrichtigen werden sobald sie neue Daten bekommen. aber ich weiß nicht wie man das in java macht. In C# wäre sowas wie delegate. Bitte Hilfe muss die Aufgabe schon abgeben aber dies Teil fällt mir.
Comment
-
Ja, das kannst du mit diesen Listener realisieren. Die Serverklasse implementiert
private PropertyChangeSupport propertySupport=new PropertyChangeSupport(this);
mit
addPropertyChangeListener
und
removePropertyChangeListener
Ein Client kann sich mit
server.addPropertyChangeListener(new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
//Server hat gefeuert
}
});
anmelden und wird dann informiert
Der Server kann mit
propertySupport.firePropertyChange(.....);
alle angemeldeten Clients informierenChristian
Comment
-
Danke aber hier ist die Beziehung zwischen Client und Server okay. was ich wissen möchte ist :wenn ich eine Klasse A, welche die Attributen sich dynamische ändern instantiiert wie kann ich aktiv benachrichtigen werde. In c# hat man so was wie myClass.Attribute += new event.......;
Danke für die Hilfe
Comment
-
Warum du nun deine Clienst nciht über die wohl ohnehin bestehende Serververbindung informiert weiss ich nicht, aber hier ein
Beispiel
[highlight=java]
public class A extends javax.swing.JFrame
{
private PropertyChangeSupport propertySupport=new PropertyChangeSupport(this);
private String oldEingabe;
public A()
{
initComponents();
oldEingabe=jTextField1.getText();
B b=new B(this);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstan ts.EXIT_ON_CLOSE);
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("javaapplicatio n95/Bundle"); // NOI18N
jTextField1.setText(bundle.getString("A.jTextField 1.text")); // NOI18N
jButton1.setText(bundle.getString("A.jButton1.text ")); // NOI18N
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jButton1)
.addContainerGap(19, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.G roupLayout.Alignment.BASELINE)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton1))
.addContainerGap(35, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
{
propertySupport.firePropertyChange("Eingabefeld",o ldEingabe,jTextField1.getText());
oldEingabe=jTextField1.getText();
}
public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
new A().setVisible(true);
}
});
}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener)
{
propertySupport.addPropertyChangeListener(listener );
}
@Override
public void removePropertyChangeListener(PropertyChangeListene r listener)
{
propertySupport.removePropertyChangeListener(liste ner);
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
}
[/highlight]
[highlight=java]
public class B
{
B(A a)
{
a.addPropertyChangeListener(new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
System.out.println("Das Eingabefeld hat sich von "+evt.getOldValue()+" nach "+evt.getNewValue()+" geändert");
}
});
}
}
[/highlight]Christian
Comment
-
Christian du machst das komplizierter eigentlich
nehmen wir an dass ich die folgende Klasse habe
public Klasse A{
private Attri1;
private Attri2;
} die Attributen ändern sich dynamische
ich instanziert diese klasse mit KlasseA myklasse =new KlasseA()
und möchte auf die Attributen zugreifen aber bevor ich auf sie zugreife möchte ich vorher benachrichtigen werden, ob sie sich geändert haben oder nicht.
Danke für die Hilfe
Comment
Comment