SplashScreenクラスを使用してJavaアプリケーションのスプラッシュ画面を作成しています。問題は、マルチモニターシステムでの位置が定義されていないことです。ドキュメントには、「マルチモニターシステムでの位置は指定されていません。プラットフォームと実装に依存します」と記載されています。このアプリケーションはマルチモニタープラットフォームでのみ使用される予定であり、常にいずれかの画面の中央に配置されるようにしたいと思います。これを達成する方法はありますか?このアプリケーションはLinuxでのみ使用されるため、プラットフォームはどこでも同じです。
5 に答える
スプラッシュ スクリーンに相当する Javafx のサンプルがあります。ただし、このスプラッシュ画面は、基本的に javafx から呼び出されてユーザーに表示される Java スイング アプレットであり、プログレス バーとロードされたコンテンツのタイトルを使用して、多かれ少なかれ Eclipse と NetBeans のスプラッシュ画面をシミュレートします。
以下は http://0divides0.wordpress.com/2011/03/17/splash-screen-with-javafx/のリンクです。
コードを取得し、Java Swings で記述されたスプラッシュ スクリーン コードを分離して、自分で使用できる必要があります。
これはカスタム Java スイング スプラッシュ スクリーンです。したがって、スプラッシュスクリーンを中央に配置するために、従来の関数を使用します
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);
受け入れられた解決策では、フレームが2つの画面の境界に表示されるという問題がありました。つまり、両方の画面の中央にあります。