2012-07-22 25 views
2

我在Windows OS上創建了一個swing應用程序。我的一個JDialog(其窗口是parentJFrame)顯示了一個JOptionPane。
JOptionPane.showMessageDialog(parentJFrame, "I am a JOption");JOptionPane顯示在父JFrame後面

在運行時,parentJFrame setAlwaysOnTop(true)。即使它設置了alwaysOnTop-TRUE,JOptionPane也會出現在Windows操作系統的parentJFrame上。但是當我在Linux操作系統上運行它時,JOptionPane顯示在parentJFrame後面(可能是因爲parentJFrame alwyasOnTop是真的,但是JRE如何以不同的方式爲不同的操作系統運行相同的應用程序?)我怎樣才能得到它在Linux的parentJFrame的頂部。?這是當務之急..
當'alwaysOnTop-true'組件顯示一個JOptionPane時,JOptionPane出現在Linux的組件後面。:(但是這在Windows操作系統中處理得很好,JOptionPane顯示在組件的頂部設置「alwaysOnTop真」。它似乎有一個矛盾顯示在Linux操作系統的桌面屏幕上的組件。我不敢肯定這樣的,但我想它。

  • Linux操作系統具有的Oracle JDK和JRE 7
+0

爲什麼不使用JOptionPane.showMessageDialog(myJDialog,「我是一個JOption」)? – Reimeus 2012-07-22 09:40:54

+0

謝謝你。是的,我做到了。然後JOptionPane出現在JDialog後面。在運行時,JOptionPane也始終處於真實狀態。 – 2012-07-22 09:59:01

回答

5

你在Linux上看到的行爲符合API規範,這就是它對Window.setAlwaysOnTop()的說法:

如果存在多個always-on-top窗口,則它們的相對順序是未指定的並且取決於平臺。

而且也:

使始終位於頂層的窗口擁有的所有窗口都繼承了這種狀態,總是在最上層的自動成爲。

這將解釋爲什麼位於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操作系統」,尤其是涉及到窗口管理的時候,有很多不同的桌面環境和窗口管理器,在涉及窗口排序和可見性時,它們的行爲往往有很大不同,通常是故意的。

+0

非常感謝。我也像你說的那樣感覺到。很好的解釋和感謝你的工作(我忘了看API,只是希望它能像windows操作系統一樣工作。)和API指南。所有優點給你.. – 2012-07-22 10:10:52

1

這是非常簡單的:

 JOptionPane optionPane = new JOptionPane("Reports are Generated"); 
     JDialog dialog = optionPane.createDialog("Success!"); 
     dialog.setAlwaysOnTop(this.isAlwaysOnTopSupported()); 
     dialog.setVisible(true); 

不要改變什麼exept字符串在雙引號:要顯示ddialog框的代碼後寫這行代碼。