Pergunta

Eu tenho essas três classes:

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:

Esta KeyListener é adicionada a um componente em um 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()....
}

O problema é: se eu executar o código e ele quer enviar um comando. Os fluxos pára escrita porque "MyKeyListener não é Serializable" ??? !! Mas eu nunca tentar enviar MyKeyListener

Foi útil?

Solução

Classes aninhadas em Java, na verdade, não existem no nível de código byte - o compilador finge-los através da inserção de campos ocultos, métodos de acesso e construtores. No seu caso, a subclasse anônima de Command provavelmente tem uma referência gerado pelo compilador para a instância MyKeyListener em que foi criado, mesmo que essa referência não é usado para qualquer coisa.

Para corrigir isso, use uma subclasse de nível superior do comando em vez de uma classe anônima.

Outras dicas

Dica:. Tente digitar MyKeyListener.this.toString () na classe (anônimo) Comando método execute ()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top