Frage

Ich habe diese drei Klassen:

Befehl:

package pack;

public abstract class Command impements java.io.Serializable
{
    public abstract void execute();
}

Auftraggeber:

package pack;

// imports....

public class Client
{
    Socket socket;

    // Constructor...

    public void sendCommand(Command c)
    {
         try
         {
              new ObjectOuputStream(socket.getOutputStream()).writeObject(c);
         } catch (Exception e) {e.printStackTrace()};
    }
}

MyKeyListener:

Dieser keyListener wird zu einer Komponente in einem JFrame.

public class MyKeyListener implements KeyListener
{

     private Client client;

     public MyKeyListener(Client c)
     { client = c; }


     public void keyTyped(....)......; // This method does nothing

     public void keyPressed(KeyEvent e)
     {
          client.sendCommand(new Command() {
               public void execute()
               {
                    new Robot().keyPress(e.getKeyCode());
               }
          });
     }

     // The same for keyRelease()....
}

Das Problem ist: Wenn ich den Code ausführen, und er will einen Befehl senden. Die Ströme hört auf zu schreiben weil "MyKeyListener ist nicht Serializable" ??? !! Aber ich versuche, nie MyKeyListener zu senden

War es hilfreich?

Lösung

Verschachtelte Klassen in Java existieren eigentlich nicht auf Byte-Code-Ebene - der Compiler täuscht sie durch versteckte Felder einfügen, Zugriffsmethoden und Konstrukteure. In Ihrem Fall hat die anonyme Unterklasse von Command wahrscheinlich einen Compiler generierte Verweis auf die MyKeyListener Instanz, in der sie erstellt wurde, auch wenn diese Referenz nicht für alles verwendet wird.

Um dies zu beheben, verwenden Sie eine Top-Level-Unterklasse von Befehl statt einer anonymen Klasse.

Andere Tipps

Hinweis: Versuchen Sie MyKeyListener.this.toString () in der (anonymen) Command Klasse Methode execute () eingeben

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top