Pregunta

Tengo estas tres clases:

Command:

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:

Este generador de claves se agrega a un componente en 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()....
}

El problema es: si ejecuto el código y él quiere enviar un comando. Las corrientes dejan de escribir. porque " MyKeyListener no es serializable " ??? !! Pero nunca trato de enviar MyKeyListener

¿Fue útil?

Solución

Las clases anidadas en Java en realidad no existen en el nivel del código de bytes: el compilador las falsifica insertando campos ocultos, métodos de acceso y constructores. En su caso, la subclase anónima de Command probablemente tenga una referencia generada por el compilador a la instancia de MyKeyListener en la que fue creada, incluso si esa referencia no se usa para nada.

Para solucionar esto, use una subclase de comando de nivel superior en lugar de una clase anónima.

Otros consejos

Sugerencia: intente escribir MyKeyListener.this.toString () en el método de ejecución () de la clase de comando (anónimo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top