2009-10-21 5 views
0

내 앱은 JFrame을 여는 JApplet입니다. 애플릿에는 청취자와 버튼이있어, 프레임이 다른 윈도우 (포커스를 잃어 버리는 것)의 뒤에있는 경우, 유저는 버튼을 클릭하면 (자), 프론트 버튼을 클릭 할 수 있습니다. frame.toFront(); 잘 작동합니다.애플릿의 브라우저 창 뒤에 JFrame이 사라짐

그러나 처음에 (투입 애플릿의 public void init() {}), 가 frame.setVisible(true);를 호출 한 후 내가하게하는 frame.toFront(); 전화 확실히 그것은 앞에서 시작합니다. 그러나 프레임은 브라우저 바로 뒤에 있습니다. 버튼을 누르면 다시 호출됩니다. 나는 반복적으로 frame.toFront();을 호출하는 별도의 스레드를 실행 해 보았습니다. 그러나 이것이 멈추 자마자 프레임은 브라우저 뒤에 있습니다. 버튼을 눌렀을 때만 앞쪽으로 와서 앞에 머물러 있습니다. 또한 루프 나 시간을 계속 앞에 두는 것은 좋은 옵션이 아닙니다. 왜냐하면 사용자가 의도적으로 뒤처지게 할 필요가 있거나 갖고 싶어 할 수 있기 때문입니다. IE, FF, Chrome, Safari는 포함하지만 Opera는 (이상하게) 포함하지 않는 Windows (1.6 버전)에서는 "버그"가 Java 1.5를 실행하는 Mac에는 표시되지 않습니다.

가능한 원인과 수정?

답변

0

프레임에서 setAlwaysOnTop (true)을 시도 했습니까? 그러나 이것이 애플릿에서 생성 된 프레임이나 윈도우에서 허용되는지 확실하지 않습니다.

+0

아니요, 허용되지 않습니다. –

0

setAlwaysOnTop(true)은 하나의 문제를 해결하지만 실제로는 사용자가 실제로 창을 뒤로 보낼 수있는 방법이 없습니다.

내 sollution가 해킹 : 이것은 기본적으로 조금 기다립니다 새로운 Thread 처음을 시작한 다음에 JFrame의를 호출

@Override 
public void windowDeactivated(WindowEvent e) 
{ 
    if(firstToBack) //firstToBack is an bloolean instance variable initialized to true 
    { 
    final JFrame f = frame; 
    new Thread() { public void run() { 
     try { Thread.sleep(300); } catch(InterruptedException ie) {} 
     f.toFront(); 
    }}.start(); 
    firstToBack = false; 
    } 
} 

다음 JFrame의에 부착되어있는 WindowListener에서 ,이 코드를 삽입 앞. 이것은 한 번만 실행되기 때문에 사용자가 프레임을 뒤로 보낼 때마다 프레임이 앞으로 계속 오지 않습니다. 300 밀리 초는 임의의 시간이며 어쩌면 필요하지 않을 수도 있습니다.

누군가가 왜이 기능을하는지 알 수 있지만, 애플릿의 init() 메소드를 사용하여 같은 종류의 스레드를 시작했을 때 스레드가 종료 된 후에 어쨌든 창은 돌아갔습니다.