2013-08-20 20 views
2

이 코드는 내 'Paneltest'jpanel이있는 Jframe을 가져옵니다.몇 초마다 Jframe에서 다시 초점을 맞추는 방법?

패널 테스트에는 URL 끝에있는 텍스트 필드의 내용이있는 웹 페이지를 시작하는 텍스트 필드와 버튼이 있습니다. (www.website.com/textfield)

웹 페이지가 시작되면 jframe에서 초점을 끌어 당깁니다. 지금까지 초점을 다시 잡으려고 시도한 방법이 효과가 없습니다.

  JFrame f = new JFrame("KioskApp"); 
      f.setSize(800, 600); 

      Paneltest Paneltest = new Paneltest(); 

      f.add(Paneltest); 

      f.setVisible(true) 

나는 잠시 문이 코드를 둘러싸는 프레임을 닫고 몇 초 후에 다시 불러 얻기 위해 끝까지 f.dispose 및 Thread.sleep를 (X)를 추가하려했지만 그것은 원인 Paneltest가 프레임에 표시되지 않습니다.

언제든지 while 루프를 추가하면 Paneltest가 표시되지 않으므로 f.toFront 또는 f.requestfocus와 같은 다른 메서드를 테스트 할 수 없습니다.

Jframe을 영구적으로 다시 초점 맞추거나 다시 시작하려면 무엇을 추가해야합니까?

편집 : 지금 내가있는 곳입니다.

내가 제안한 코드를 추가하면, 마루 ち ゃ だ だ よ. 그럼 모든 일은 작업 표시 줄의 프레임 하이라이트 탭입니다.

Bringtofront 여기

package kioskapp; 

import java.util.Timer; 
import java.util.TimerTask; 
import javax.swing.JFrame; 

/** 
* 
* @author jorent 
*/ 
public class BringToFront { 
    JFrame frame; 
    Timer timer; 


    public BringToFront(JFrame frame) { 
this.frame = frame; 
timer = new Timer(); 
timer.schedule(new ToFrontTask(), 5000); 
} 
    class ToFrontTask extends TimerTask { 

    @Override 
    public void run() { 
    frame.toFront(); 
    frame.repaint(); 

} 
    } 
} 

내가가 .alwaysontop 추가하면

InitialSetupPane

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           


    JFrame f1 = new JFrame("KioskApp");//initializes frame to open the panel 
      f1.setSize(650, 400);// Functionless setting of the size, I used it to approximate the size of the destination screen 

      Paneltest Paneltest = new Paneltest();//initializes Panel to be put in the fram 

      f1.add(Paneltest);// puts the panel in the fram 

      f1.setUndecorated(true);// Removes the ability to mess with the screen 

      f1.setVisible(true);//makes the frame visible 

      f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// When not fullscreen(not a possibility now) changes the (X) button to close instead of hide the frame 

      f1.setExtendedState(JFrame.MAXIMIZED_BOTH);// Fullsc  

      new BringToFront (f1); 


} 

을 집중할 필요가 JFrame의 구현 코드에서 조각입니다 정면으로 가져 오면 작동하지만 나에게 내게 알려줘. 창을 클릭하지 않고 프레임의 텍스트 필드에 아무 것도 입력하지 마십시오 (최종 사용자에게는 클릭이 비활성화되어 작동하지 않습니다).

답변

0

다른 스레드 또는 타이머에서 .toFront()/.requestFocus()을 실행해야합니다.

예 사용하여 스레드 :

new Thread() 
{ 
    public void run() { 
     while(true) { 
      f.requestFocus(); // or f.toFront() 
      Thread.sleep(1000); // Sleep for 1 second 
     } 
    } 
}.start(); 

예 사용하여 타이머 :

public class BringToFront { 
    JFrame frame; 
    Timer timer; 

    public BringToFront(JFrame frame) { 
    this.frame = frame; 
    timer = new Timer(); 
    timer.schedule(new ToFrontTask(), 1000); // 1 second intervals 
    } 

    class ToFrontTask extends TimerTask { 
    public void run() { 
     frame.toFront(); 
     frame.repaint(); 
    } 
    } 

    public static void main(String args[]) { 
     JFrame f = new JFrame("KioskApp"); 
     f.setSize(800, 600); 
     Paneltest Paneltest = new Paneltest(); 
     f.add(Paneltest); 
     f.setVisible(true) 
     new BringToFront(f); 
    } 
} 

이 타이머 방법으로 호출 할 수 있도록 내가 JFrame의 참조를 캡슐화 타이머 예에서, 당신은 동일한 작업을 수행 할 수 있습니다 쓰레드 하나.

편집 : 타이머와 usign invokeLater 당신은 타이머 콜백의 run() 방법 내부의 코드를 배치 할 수 있습니다에 대한 :

... 

class ToFrontTask extends TimerTask { 
    public void run() { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       myFrame.toFront(); 
       myFrame.repaint(); 
      } 
     }); 
    } 
} 

... 
+0

이 만드는 그 프레임은 작업 표시 줄에서 강조되지만 가져 오지 않도록 그것을 앞으로. 당신이 제공 한 링크를 보았습니다. (그들이 가지고있는 문제는 정확히 이것입니다.) .invokelater와 timer를 어떻게 함께 사용합니까? – JorangeThiessen

+0

그 사용 예를 추가하기 위해 편집 됨 –

관련 문제