2015-06-26 3 views
0

Проверка игры, я иногда получаю исключения, возникающие, когда компонент не отображается. Я добавил цикл ожидания на isDisplayable().Ожидание isDisplyable для компонента

Кажется, что моя игра может занять несколько сотен мс. чтобы стать отображаемыми.

- это разумный способ справиться с этой проблемой?

Я тестирую игровые клиенты, которые говорят о сокетах на сервере.

thanks

Редактировать 1: спасибо за комментарии. я обнаружил, что добавляю медиатор для gui (наблюдателя) к модели (наблюдаемой) до того, как gui завершает свою конструкцию и инициализацию. это ухудшается, так как я инициализирую панель с вызовами createImage, которая возвращает null и throws.

import java.awt.*; 
import javax.swing.*; 
public class WaitForFrameToBeVisible { 
    JFrame frame=new JFrame("FrameDemo"); 
    private void createAndShowGUI() { 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel emptyLabel=new JLabel(""); 
     emptyLabel.setPreferredSize(new Dimension(175,100)); 
     frame.getContentPane().add(emptyLabel,BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    void run() throws Exception { 
     System.out.println("waiting for frame to be displayable"); 
     long t0=System.nanoTime(); 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
     while (!frame.isDisplayable()) 
      Thread.sleep(1); 
     long dt=System.nanoTime()-t0; 
     System.out.println("waited "+dt/1_000_000.+" ms. for frame to be displayable"); 
    } 
    public static void main(String[] args) throws Exception { 
     new WaitForFrameToBeVisible().run(); 
    } 
} 
+0

Я бы «догадался», что у вас есть условие гонки нитей между временем, которое требуется Swing API для создания и проверки пользовательского интерфейса и того, что когда-либо пытается его обновить, но это сложно сказать. Нет, лично, это не разумный способ подойти к проблеме, Swing не является потокобезопасным, поэтому вы рискуете другим расовым состоянием. То, что я мог бы попробовать, это использовать «WindowListener» и прослушивать изменение видимости, но вам придется проверить его до 100%. – MadProgrammer

+0

Почему вы делаете Swing в потоке, который не является Swing/AWT нить? – immibis

+0

@immibis, о котором вы говорите? –

ответ

0

Вам не нужно использовать isDisplayable(). Вы можете использовать invokeAndWait(...) за то, что вы пытаетесь сделать:

javax.swing.SwingUtilities.invokeAndWait(new Runnable() { 
    public void run() { 
     createAndShowGUI(); 
    } 
}); 
// control will reach here when the GUI will be created 

Обратите внимание, что это так, как вы на самом деле не проверять, если кадр виден, но вы проверяете, если createAndShowGUI() сделал свою работу

Другое дело, вы не должны звонить isDisplayable() или любую функцию, подобную этой в цикле. Он будет потреблять ненужную скорость обработки. Вместо этого используйте wait-notify.

Но, насколько ваш случай касается использования WindowListener, это очень хорошая идея, как предложено MadProgrammer.

+0

Ожидание возврата 'invokeAndWait' не гарантирует, что кадр будет видимым или отображаемым, поскольку процесс может генерировать другие события, которые добавляются в EDT после' createAndShowGUI 'завершено (и возвращается' invokeAndWait') - Это просто еще одно условие гонки – MadProgrammer

+0

Думаю, я объяснил это сразу после написания кода. – afzalex

+0

Но вам не стоит даже упоминать об этом, это действительно не решает проблему и вводит еще одно возможное условие гонки. Так же, как вы никогда не должны изменять компонент вне контекста EDT, вы никогда не должны запрашивать их состояние, так как это просто заставляет задуматься о состоянии гонки: P – MadProgrammer

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

  • Нет связанных вопросов^_^