Проверка игры, я иногда получаю исключения, возникающие, когда компонент не отображается. Я добавил цикл ожидания на 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();
}
}
Я бы «догадался», что у вас есть условие гонки нитей между временем, которое требуется Swing API для создания и проверки пользовательского интерфейса и того, что когда-либо пытается его обновить, но это сложно сказать. Нет, лично, это не разумный способ подойти к проблеме, Swing не является потокобезопасным, поэтому вы рискуете другим расовым состоянием. То, что я мог бы попробовать, это использовать «WindowListener» и прослушивать изменение видимости, но вам придется проверить его до 100%. – MadProgrammer
Почему вы делаете Swing в потоке, который не является Swing/AWT нить? – immibis
@immibis, о котором вы говорите? –