我正在编写一个实用程序以帮助测试更大的系统,并且如果通过系统运行它,我的UI完全不显示。当我自己运行它时它工作正常。更多细节:Swing应用程序在某些情况下不显示
- 我测试的系统有很多进程,由控制器管理。部署时,controller.exe会生成并终止子进程,包括我的Java应用程序。当由控制器启动时,我的应用运行正常(工作,生成日志等),但Swing UI根本不呈现。
- 我可以从命令行自己启动我的应用程序,并且UI显示得很好。根据Process Explorer,路径,命令行和当前目录与从应用程序从控制器启动时观察到的值完全相同。
- 当该应用程序不可见时,单击Process Explorer中的“带到前面”弹出一个对话框。 “在这个过程中找不到可见的窗口。”单击手动衍生进程上的相同按钮可以使Swing UI如预期的那样前进。
- 我在Windows XP中测试这个。控制器进程在SYSTEM下运行。我使用"at 09:45 /interactive cmd.exe" trick为我的手动启动生成命令提示符作为SYSTEM。 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]
[email protected][dev=Win32GraphicsDevice[screen=0],pixfmt=0]
java.awt.Rectangle[x=0,y=0,width=1920,height=1080]
这似乎表明有一个配置只有一台设备,所以我在一个小的损失的。
对于一个问题,+1太复杂了:-) – mKorbel 2012-03-05 21:15:08