Я Джейсон. У меня небольшая проблема с внешним видом Substance (https://substance.dev.java.net/).
Моя проблема более общая. Я уже написал свой графический интерфейс, и он работает нормально, но когда я использую Substance Look-and-feel, он требует, чтобы вся инициализация GUI происходила в потоке EDT (поток диспетчеризации событий или что-то в этом роде).
Прямо сейчас я использую com.sun.java.swing.plaf.windows.WindowsLookAndFeel (не уверен, что правильно написал), и ничего подобного не требуется.
Поэтому я поместил основную инициализацию в EDT, вызвав SwingUtilities.invokeLater(). Это заставило его работать. Однако программа также порождает несколько других окон во время своего выполнения. Прямо сейчас у меня есть код вроде:
SomeNewWindow window = new SomeNewWindow();
// ... some bs emitted
window.doStuff();
Этот код работает нормально, потому что к моменту вызова window.doStuff() он уже инициализирован. Но Substance требует от меня сделать что-то вроде этого:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
SomeNewWindow window = new SomeNewWindow();
}});
// ... bs emitted
window.doStuff();
Здесь он иногда генерирует исключение NullPointerException, потому что окно не инициализировано к моменту вызова window.doStuff(). Я не могу поместить window.doStuff() в поток EDT, потому что обычно для возврата требуется несколько секунд, и графический интерфейс зависает.
Я попытался поместить Thread.sleep(1000) сразу после вызова потока EDT, потому что к тому времени он, вероятно, уже инициализирован. Но это кажется неудобным. Мне просто нужен способ, чтобы основной поток «знал», когда возвращается инициализация SomeNewWindow, чтобы он мог продолжать работу, не беспокоясь об исключении NullPointerException.
Заранее спасибо.