java.lang.ClassCastException 가 throw 된다... - xrath.com 에서 번역됨

> ## 마우스가 애플릿의 프레임상을 이동하면(자) `java.lang.ClassCastException` 가 AWT 이벤트발송쓰레드로부터 throw 된다

> ###
> 증상

> > 애플릿을 Sun JRE 를 사용한 브라우저로 실행하고 있을 때, 마우스가 애플릿의 프레임상을 이동하면(자),`ClassCastException` 가 AWT 이벤트발송쓰레드로부터 throw 됩니다. 같은 애플릿이 Microsoft VM 에서는 실행할 수 있습니다.

> > `java.lang.ClassCastException:sun.plugin....
> > at MyApplet.mouseExit(Unknown Source)
> > at java.awt.Component.handleEvent(Unknown Source)
> > at java.awt.Component.postEvent(Unknown Source)
> > at java.awt.Component.dispatchEventImpl(Unknown Source)
> > at java.awt.Container.dispatchEventImpl(Unknown Source)
> > at java.awt.Component.dispatchEvent(Unknown Source)
> > at java.awt.EventQueue.dispatchEvent(Unknown Source)
> > at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
> > at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
> > at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
> > at java.awt.EventDispatchThread.run(Unknown Source)`

> ### 원인

> > 이 예외에는, 생각되는 원인이 2 개 있습니다.

> > 1. 프레임상의 마우스 이벤트를 추적하기 위해서, 애플릿에서는 프레임에 `MouseListener` 를 등록하려고 합니다. Microsoft VM 의 구현에서는, AWT 계층 컴퍼넌트 트리 애플릿에 있어서의 애플릿의 직접적인 부모는 프레임입니다. 이것은 구현 고유하고, 변경될 가능성이 있는 것에도 불구하고, 코드로 의존하고 있는 애플릿이 있습니다.
> >    `public void foo()
> >    {
> >    Frame f = (Frame) getParent();
> >    ....
> >    }`
> >    Sun JRE 에서는 애플릿과 프레임의 사이에 다른 컨테이너가 있기 (위해)때문에,`getParent()` 는 `Frame` 객체를 돌려주지 않고, 상기의 코드에서는 `ClassCastException` 가 throw 됩니다.
> > 2. Microsoft VM 의 구현에서는,`java.applet.AppletContext` 는 애플릿의 프레임으로 구현되고 있습니다. 이것은 구현 고유하고, 변경될 가능성이 있는 것에도 불구하고, 코드로 의존하고 있는 애플릿이 있습니다.
> >    `public void foo()
> >    {
> >    Frame f = (Frame) getParent();
> >    ....
> >    AppletContext ac = (AppletContext) f;
> >    ....
> >    }`

> >    Sun JRE 에서는 다른 객체를 사용해 `AppletContext` 를 구현하고 있기 (위해)때문에, 상기의 코드에서는 `ClassCastException` 가 throw 됩니다.

> ### 해결 방법

> > 최초의 예를 회피하려면 , 포함 관계의 특정의 레벨에 있어서의 프레임에 의존하는 것이 아니라, AWT 계층 컴퍼넌트 트리 전체를 애플릿으로부터 이동해 프레임의 위치를 특정합니다.

> > > `public void foo()
> > > {
> > > // Navigate component tree
> > > Container c = getParent();
> > > while (c ! = null && (c instanceof Frame) == false)
> > > c = c.getParent();
> > > // Cast Container to Frame
> > > if (c instanceof Frame)
> > > {
> > > Frame f = (Frame) c;
> > > ...
> > > }
> > > }`

> > 2 번째의 예를 회피하려면 ,`Applet.getAppletContext()` 메소드를 사용해 `AppletContext` 에 액세스 합니다.
> > `public void foo()
> > {
> > ....
> > AppletContext ac = (AppletContext) getAppletContext();
> > ...
> > }`

> ### 상세 정보

> 없음