【发布时间】:2012-03-02 17:44:28
【问题描述】:
我正在编写一个实用程序来帮助测试一个更大的系统,如果我通过系统运行它,我的 UI 根本不会显示。当我自己运行它时它工作正常。更多详情:
- 我正在测试的系统有许多进程,由控制器管理。部署后,controller.exe 会生成并终止子进程,包括我的 java 应用程序。当由控制器启动时,我的应用程序运行良好(确实可以工作、生成日志等),但 Swing UI 根本不呈现。
- 我可以自己从命令行启动我的应用程序,并且 UI 显示得很好。根据 Process Explorer,路径、命令行和当前目录都与从控制器启动应用时观察到的值相同。
- 当应用程序不可见时,单击进程资源管理器中的“置于前面”会弹出一个对话框,显示。 “找不到此进程的可见窗口。”在手动生成的进程上单击相同的按钮会使 Swing UI 按预期显示在前面。
- 我正在 Windows XP 中对此进行测试。控制器进程在 SYSTEM 下运行。我使用"at 09:45 /interactive cmd.exe" trick 为我的手动启动生成一个命令提示符作为系统。 Process Explorer 验证这两种方法(手动/控制器)是否将 java 进程生成为 SYSTEM。
- 两个进程之间唯一明显的区别是父进程。系统进程作为 controller.exe 的子进程生成,而我的手动执行是 cmd.exe 的子进程。
- 我已经使用 jdwp 远程调试到不可见进程,一切正常。 UI 代码执行,没有抛出异常,我的 JLists 甚至被它们监视的数据填充。据我所知,一切正常;我就是什么都看不到。
如果这已在其他地方得到回答,我深表歉意。我尽我所能四处搜索,但我能找到的所有问题都是关于某些组件无法呈现,而不是整个应用程序无法显示。
谢谢!
编辑: 根据反馈,我换了一个尽可能小的演示程序。这是完整的代码:
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]
这似乎表明只有一个设备具有一个配置,所以我有点茫然。
【问题讨论】:
标签: java swing windows-xp