JFrame исчезает за окном браузера апплета - PullRequest
0 голосов
/ 21 октября 2009

Мое приложение - это JApplet, который открывает JFrame. у апплета есть слушатель и кнопка, так что если рамка идет за другим окном (теряет фокус), пользователь может просто нажать кнопку, чтобы она вышла вперед. frame.toFront(); Это отлично работает.

Но изначально (в апплете public void init() {}), после вызова frame.setVisible(true); я звоню frame.toFront();, чтобы убедиться, что он начинается впереди Тем не менее, кадр сразу же идет за браузером. Нажатие кнопки вызывает его обратно, хотя. Я попытался запустить отдельный поток, который неоднократно вызывает frame.toFront(); Но как только это останавливается, фрейм в любом случае идет за браузером. Только когда кнопка нажата, она выходит вперед и остается впереди. Кроме того, наличие петли или времени, постоянно держащего его впереди, не является хорошим вариантом, потому что пользователь может нуждаться или желать, чтобы он умышленно отставал. Эта «ошибка» отсутствует не на Mac (на котором работает Java 1.5), а на Windows (под управлением 1.6), включая IE, FF, Chrome, Safari, но не Opera (как ни странно).

Возможная причина и устранение?

Ответы [ 2 ]

0 голосов
/ 22 октября 2009

setAlwaysOnTop(true) решает одну проблему, но создает другую, а именно то, что теперь пользователь не может отправить окно назад.

Мое решение - хак: В WindowListener, прикрепленном к 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 вперед. Он выполняется только один раз, поэтому кадр не продолжает поступать вперед, каждый раз, когда пользователь отправляет его обратно. 300 миллисекунд - это произвольное количество времени и, возможно, даже не обязательно.

Возможно, кто-то может сказать мне, почему это работает, но когда тот же тип потока был запущен из метода init () апплета, окно все равно ушло назад, после завершения потока?

0 голосов
/ 21 октября 2009

Вы пытались установить setAlwaysOnTop (true) на кадре? Однако я не уверен, разрешено ли это для фреймов или окон, созданных из апплета.

...