0

私はこれらの3つのクラスを持っています:

指示:

package pack;

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

クライアント:

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:

このキーリスナーは、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()....
}

問題は、私がコードを実行し、彼がコマンドを送信したい場合です。「MyKeyListenerはSerializableではない」ため、ストリームは書き込みを停止します???!! しかし、私は決して送信しようとしませんMyKeyListener

4

2 に答える 2

8

Javaのネストされたクラスは、実際にはバイトコードレベルでは存在しません。コンパイラは、非表示フィールド、アクセスメソッド、およびコンストラクタを挿入することにより、それらを偽造します。あなたの場合、の匿名サブクラスには、その参照が何にも使用されていない場合でも、作成されCommandたインスタンスへのコンパイラ生成参照が含まれている可能性があります。MyKeyListener

これを修正するには、匿名クラスの代わりにCommandのトップレベルサブクラスを使用します。

于 2009-09-11T16:17:40.670 に答える
0

ヒント:(匿名の)コマンドクラスexecute()メソッドにMyKeyListener.this.toString()と入力してみてください。

于 2009-09-11T16:16:12.187 に答える