Domanda

Ho queste tre classi:

Comando:

package pack;

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

Cliente:

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:

Questo keylistener viene aggiunto a un componente in 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()....
}

Il problema è: se eseguo il codice e vuole inviare un comando. I flussi smettono di scrivere perché " MyKeyListener non è serializzabile " ??? !! Ma non provo mai a inviare MyKeyListener

È stato utile?

Soluzione

Le classi nidificate in Java in realtà non esistono a livello di codice byte: il compilatore le simula inserendo campi nascosti, metodi di accesso e costruttori. Nel tuo caso, la sottoclasse anonima di Command probabilmente ha un riferimento generato dal compilatore all'istanza MyKeyListener in cui è stato creato, anche se quel riferimento non viene utilizzato per nulla.

Per risolvere questo problema, utilizzare una sottoclasse di livello superiore di Command anziché una classe anonima.

Altri suggerimenti

Suggerimento: prova a digitare MyKeyListener.this.toString () nel metodo execute () della classe di comando (anonimo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top