如何每隔几秒重新聚焦一个Jframe?

时间:2013-08-20 23:13:30

标签: focus jframe jpanel

此代码在我的'Paneltest'jpanel内部显示了一个Jframe。

Panel测试有一个文本字段和按钮,用于启动网页,其中包含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)

我尝试使用while语句包含此代码,并将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();

}
  }
}

以下是我实现需要重新聚焦的Jframe的代码片段

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);


}  

如果我添加.alwaysontop带到前面它会工作,但我不允许我在框架的文本字段中输入任何内容而不点击窗口(点击将被禁用给最终用户,因此不起作用) 。

1 个答案:

答案 0 :(得分: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引用,因此可以通过timer方法调用它,您也可以为Thread 1执行相同操作。

编辑:对于使用Timer调用invokeLater,您可以将代码放在定时器回调的run()方法中:

...

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

...