2013-08-20 5 views
2

Этот код вызывает Jframe с моей «Paneltest» jpanel внутри.Как перефокусироваться на Jframe каждые несколько секунд?

Панельный тест имеет текстовое поле и кнопку, которая запускает веб-страницу со всем, что находится в текстовом поле в конце URL-адреса, I.E. (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 (х) до конца, чтобы получить его, чтобы закрыть рамку и довести его снова через несколько секунд, но это вызвало 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(); 

} 
    } 
} 

Вот отрывок из кода, где я реализую фрейм, что необходимо переориентировать

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 в вывести на передний план, он будет работать, но я не позволяю мне ype в текстовое поле кадра без щелчка по окну (щелчок будет отключен для конечного пользователя, так что это не сработает).

ответ

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 так что он может быть вызван с помощью метода таймера, вы можете сделать то же самое для Thread.

Edit: для 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 и таймер вместе? – JorangeThiessen

+0

Я отредактировал, чтобы добавить этот пример использования –

Смежные вопросы