Announcement

Collapse
No announcement yet.

Event mit parater ausgeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Event mit parater ausgeben

    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

  • #2
    Was für ein Event? Swing? AWT?
    Christian

    Comment


    • #3
      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


      • #4
        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.html
        Christian

        Comment


        • #5
          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


          • #6
            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 informieren
            Christian

            Comment


            • #7
              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


              • #8
                Was ist an Beitrag #6 der genau das realisiert unverständlich?
                Christian

                Comment


                • #9
                  Christian kannst du mir Tutorien empfohlen wo ich Beispiele finde denn ich verstehe deine Code nicht fällt vlt Grundlage.
                  Danke

                  Comment


                  • #10
                    Schon mal auf die Links geklickt?
                    Christian

                    Comment


                    • #11
                      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


                      • #12
                        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


                        • #13
                          Christian du machst das komplizierter eigentlich
                          Na, dann mach es halt einfacher
                          Christian

                          Comment


                          • #14
                            Tut mir Leid aber das War nicht böse gemeint
                            ich wollte nur sagen, dass ich weiß einfacher brauche .
                            kannst du mir bitte weiter helfen

                            Comment


                            • #15
                              Du willst informiert werden, wenn sich in einer Klasse etwas ändert. Einen Listener willst du nicht, weill es zu kompliziert ist? Was willst du dann?
                              Christian

                              Comment

                              Working...
                              X