Question

J'ai ces trois classes:

Commande:

package pack;

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

Client:

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:

Ce keylistener est ajouté à un composant d'un 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()....
}

Le problème est le suivant: si je lance le code et qu'il souhaite envoyer une commande. Les flux cesse d'écrire car " MyKeyListener is not Serializable " ??? !! Mais je n’essaye jamais d’envoyer MyKeyListener

Était-ce utile?

La solution

En réalité, les classes imbriquées en Java n'existent pas au niveau du code octet - le compilateur les simule en insérant des champs cachés, des méthodes d'accès et des constructeurs. Dans votre cas, la sous-classe anonyme de la Commande contient probablement une référence générée par le compilateur à l'instance MyKeyListener dans laquelle elle a été créée, même si cette référence n'est utilisée à aucune fin.

Pour résoudre ce problème, utilisez une sous-classe de niveau supérieur de Command au lieu d'une classe anonyme.

Autres conseils

Conseil: essayez de taper MyKeyListener.this.toString () dans la méthode (anonymous) Command de la méthode execute ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top