Я пишу утилиту, которая поможет с тестированием гораздо более крупной системы, и мой пользовательский интерфейс вообще не отображается, если я запускаю ее через систему. Он отлично работает, когда я запускаю его сам. Подробнее:
- Система, которую я тестирую, имеет много процессов, управляемых контроллером. При развертывании controller.exe порождает и завершает дочерние процессы, включая мое приложение Java. Когда приложение запускается контроллером, оно работает нормально (работает, генерирует журналы и т. Д.), Но интерфейс Swing вообще не рендерится.
- Я могу запустить свое приложение самостоятельно из командной строки, и пользовательский интерфейс отображается очень хорошо. Согласно Process Explorer, путь, командная строка и текущий каталог идентичны значениям, наблюдаемым при запуске приложения из контроллера.
- Когда приложение невидимо, при нажатии «Переместить на передний план» в Process Explorer появляется диалоговое окно с надписью. «Не найдено видимых окон для этого процесса». Нажатие на ту же кнопку в процессе ручного запуска приводит к тому, что пользовательский интерфейс Swing выходит на передний план, как и ожидалось.
- Я тестирую это в Windows XP. Процесс контроллера работает под СИСТЕМОЙ. Я использовал трюк "at 09:45 / interactive cmd.exe" , чтобы вызвать командную строку в качестве SYSTEM для запуска вручную. Process Explorer проверяет, что оба метода (ручной / контроллер) порождают процесс Java как SYSTEM.
- Единственное очевидное различие между этими двумя процессами - это родители. Системный процесс порождается как дочерний элемент controller.exe, в то время как мои ручные выполнения являются дочерними по отношению к cmd.exe.
- Я удаленно отлаживал в невидимом процессе, используя jdwp, и все выглядит нормально. Код пользовательского интерфейса выполняется, исключений нет, и мои списки JL даже заполняются данными, которые они отслеживают. Насколько я могу сказать, все работает; Я просто не вижу ничего из этого.
Прошу прощения, если на этот вопрос уже был дан ответ. Я приложил все усилия, чтобы поискать, но все вопросы, которые я мог найти, касаются определенных компонентов, которые не могут быть отображены, и никогда не будут отображаться во всем приложении.
Спасибо!
изменения:
Основываясь на отзывах, я поменял демонстрационную программу, которая настолько мала, насколько это возможно. Вот весь код:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class AceProbe
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JFrame frame = new JFrame("Visible?");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new JLabel("Test"), BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
});
}
}
Запуск этого из командной строки отображает окно, как и ожидалось. Однако, когда контроллер запускает процесс, ничего не отображается. При появлении контроллера я могу удаленно отлаживать процесс, используя -agentlib:jdwp=transport=dt_socket,suspend=y,server=y,address=8000
, и проверяю, что все потоки создаются должным образом, и никаких исключений не выдается.
Моя интуиция заключается в том, что контроллер находится в какой-то странной графической конфигурации и, поскольку родительский процесс является новым процессом Java, возможно, Swing не использует правильный GraphicsDevice? Я попытался добавить этот код:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
for(GraphicsDevice d : ge.getScreenDevices())
{
Log.println(d);
for (GraphicsConfiguration c : d.getConfigurations())
{
Log.println(c);
Log.println(c.getBounds());
}
}
Журнал содержит это:
Win32GraphicsDevice[screen=0]
sun.awt.Win32GraphicsConfig@13f459d[dev=Win32GraphicsDevice[screen=0],pixfmt=0]
java.awt.Rectangle[x=0,y=0,width=1920,height=1080]
, что указывает на то, что есть только одно устройство с одним конфигом, так что я немного растерялся.