場合によっては、既存のコンポーネントに関連するポップアップまたはダイアログを表示する必要があります (主な例は、横にカレンダー ボタンがある日付入力コントロールです)。
何年もの間、うまく機能していましたが、カレンダーが画面の外に部分的に表示されるというバグが常にありました (フィールドのすぐ右に表示されるようにハードコードされていました)。ウィンドウの右端に日付コントロールがなかったので、誰も気付かなかったのです。最近、新しいウィンドウが追加されて変更されました。
それでは、ウィンドウの位置を(あるべき場所に配置した後)画面上に完全に収まるように修正してみましょう。まさにそれを行うための簡単なユーティリティ メソッドを作成しました。
public static void correctWindowLocationForScreen(Window window) {
GraphicsConfiguration gc = window.getGraphicsConfiguration();
Rectangle screenRect = gc.getBounds();
Rectangle windowRect = window.getBounds();
Rectangle newRect = new Rectangle(windowRect);
if (windowRect.x + windowRect.width > screenRect.x + screenRect.width)
newRect.x = screenRect.x + screenRect.width - windowRect.width;
if (windowRect.y + windowRect.height > screenRect.y + screenRect.height)
newRect.y = screenRect.y + screenRect.height - windowRect.height;
if (windowRect.x < screenRect.x)
newRect.x = screenRect.x;
if (windowRect.y < screenRect.y)
newRect.y = screenRect.y;
if (!newRect.equals(windowRect))
window.setLocation(newRect.x, newRect.y);
}
問題が解決しました。か否か。トリガー コンポーネント (カレンダーを表示するボタン) からの画面上の座標を使用して、ウィンドウを配置します。
JComponent invoker = ... // passed in from the date field (a JButton)
Window owner = SwingUtilities.getWindowAncestor(invoker);
JDialog dialog = new JDialog(owner);
dialog.setLocation(invoker.getLocationOnScreen());
correctWindowLocationForScreen(dialog);
「invoker」コンポーネントが2 つの画面にまたがるウィンドウにある場合、大混乱が発生します。どうやら「window.getGraphicsConfiguration()」は、ウィンドウの左上隅がたまたまあるグラフィック構成を返します。これは、必ずしもウィンドウ内の日付コンポーネントが配置されている画面ではありません。
この場合、どうすればダイアログを適切に配置できますか?