문제

이 세 가지 수업이 있습니다.

명령:

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 :

이 Keylistener는 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가 직렬화 할 수 없기 때문에 스트림은 쓰기를 중지합니다. ??? !! 그러나 나는 결코 보내려고하지 않습니다 MyKeyListener

도움이 되었습니까?

해결책

Java의 중첩 클래스는 실제로 바이트 코드 레벨에 존재하지 않습니다. 컴파일러는 숨겨진 필드, 액세스 방법 및 생성자를 삽입하여이를 위태 롭습니다. 귀하의 경우 익명의 서브 클래스 Command 아마도 컴파일러 생성 된 참조가있을 것입니다 MyKeyListener 그 참조가 아무것도 사용하지 않더라도 생성 된 인스턴스.

이 문제를 해결하려면 익명 클래스 대신 최상위 하위 클래스의 명령을 사용하십시오.

다른 팁

힌트 : (익명) 명령 클래스 execute () 메소드에서 mykeylistener.this.tostring ()을 입력하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top