我正在使用 SplashScreen 类为 Java 应用程序创建启动画面。问题是多显示器系统上的位置未定义。该文档指出“未指定多显示器系统的位置 - 它取决于平台和实现”。该应用程序将仅在多显示器平台上使用,我想确保它始终位于其中一个屏幕的中心。有什么办法可以做到这一点?该应用程序将仅在 Linux 上使用,因此平台在任何地方都是相同的。
5 回答
有一个与 Splash screen 等效的示例 Javafx。然而,这个闪屏基本上是一个 java swing 小程序,它从 javafx 调用以显示给用户,并使用进度条和加载内容的标题或多或少地模拟 eclipse 和 netbeans 闪屏。
以下是 http://0divides0.wordpress.com/2011/03/17/splash-screen-with-javafx/上的链接
您必须能够获取代码并分离出用java swings编写的启动屏幕代码并自己使用。
这是一个自定义的 java swing 启动画面。因此,它使用传统功能来居中启动画面
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension labelSize = l.getPreferredSize();
setLocation(screenSize.width / 2 - (labelSize.width / 2), screenSize.height / 2 - (labelSize.height / 2));
然后不要使用 Java 6 中的内置启动画面。使用 UI 工具包创建自己的启动画面,并通过计算窗口大小和可用屏幕大小来手动定位窗口。
另一个示例代码:
// Get the size of the screen
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
// Determine the new location of the window
int w = login.getSize().width;
int h = login.getSize().height;
int x = (dim.width-w)/2;
int y = (dim.height-h)/2;
// Move the window
setLocation(x, y);
setVisible(true);
它可能不是在 Java 的上下文中定义的,但它肯定是在显示服务器的上下文中定义的。
对于 Linux / X11,重要的方面是XInerama是否启用。此 X 扩展使应用程序能够了解构成桌面的物理显示器。
验证 XInerama 是否已启用的一种快速方法是尝试在多显示器目标系统上最大化窗口。启用 XInerama 后,它应该只最大化活动显示器的尺寸,而不是整个屏幕表面。
启动 XInerama 时,启动屏幕将在应用程序启动时以活动监视器为中心。
如果您只专注于正确定位应用程序的启动屏幕,您将很快获得有关其他多显示器问题的反馈,例如跨所有屏幕的任务栏或在所有屏幕上最大化的窗口。
将框架在屏幕上居中的另一种解决方案:
GraphicsConfiguration c = frm.getGraphicsConfiguration();
Rectangle in = c.getBounds();
int center_x = in.x + in.width / 2;
int center_y = in.y + in.height / 2;
frm.setLocation(center_x - frm.getWidth()/2, center_y - frm.getHeight()/2);
使用公认的解决方案时,我遇到了框架显示在两个屏幕的边界处的问题。即在两个屏幕的中心。