2

Windows OSでswingアプリケーションを作成しました。私の JDialog (そのウィンドウはparentJFrame) の 1 つに JOptionPane が表示されます。
JOptionPane.showMessageDialog(parentJFrame, "I am a JOption");.

実行時に、parentJFrame setAlwaysOnTop(true). alwaysOnTop-TRUE が設定されていても、JOptionPane は Windows OS の parentJFrame に表示されます。しかし、Linux OSで実行すると、JOptionPaneはparentJFrameの後ろに表示されます. LinuxのparentJFrameのトップ。これは至急お願い
します.. 'alwaysOnTop-true' コンポーネントが JOptionPane を表示すると、Linux では JOptionPane がコンポーネントの後ろに表示されます. :( .しかし、これは Windows OS でうまく処理されました. JOptionPane は、設定されているコンポーネントの上部に表示されます'alwaysOnTop-true' . Linux OS でデスクトップ画面にコンポーネントを表示するという競合が発生しているようです.. よくわかりません.

  • Linux OS には Oracle JDK と JRE 7 があります
4

2 に答える 2

5

Linux で見られる動作は、API 仕様に準拠しています。これは、Window.setAlwaysOnTop()について次のように述べています。

最前面に複数のウィンドウがある場合、それらの相対的な順序は指定されておらず、プラットフォームに依存します。

また:

常に最前面に表示されるウィンドウが所有するすべてのウィンドウは、この状態を継承し、自動的に最前面に表示されます。

これは、JOptionPane の中心にある JDialog も「常に最上位」のステータスを持っている理由を説明します。Windows では、たまたま期待どおりに動作するように見えますが、実際には、Swing に不可能なことを要求しています。「常に他のウィンドウの上に」親を表示するだけでなく、その上にダイアログを表示することです。

考えられる回避策は次のとおりです。ダイアログを親の隣に配置して、z 軸上でダイアログが下にある間、ユーザーには表示されるようにします。

JDialog dialog = new JOptionPane("Message").createDialog(parent, "Title");
Point dialogLoc = dialog.getLocation();
Point parentLoc = parent.getLocation();
dialog.setLocation(parentLoc.x + parent.getWidth(), dialogLoc.y);
dialog.setVisible(true);

特にウィンドウ管理に関しては、単一の「Linux OS」は存在しないことに注意してください。多くの場合、意図的にウィンドウの順序付けと可視性に関して、大きく異なる方法で動作するさまざまなデスクトップ環境とウィンドウ マネージャーが多数存在します。

于 2012-07-22T10:03:21.677 に答える