2015-02-17 103 views
1

我無法獲取消息框和度數對話框以在Mac(v10.9.5)中正常顯示/運行。獲取JOptionPane.showConfirmDialog()在Mac OSX上運行

我剛更新了JRE和JDK到最新版本(8u31)。終端窗口中的「java -version」顯示我確實使用8u31。 (我以前使用8u20,它表現出相同的行爲。)

下面的代碼在Windows和我測試的幾個不同版本的Linux中完美工作,沒有問題。我只是在Mac上遇到問題。我簡化我的代碼,這是基於SWT,但這個例子中使用Swing,以下幾點:

package myTest; 

import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class EntryCode 
{ 
    public static EntryCode oEntryCode; 

    public EntryCode() 
    { 
     // TODO Auto-generated constructor stub 
    } 

    public static void main(String[] args) 
    { 
     oEntryCode = new EntryCode(); 

     oEntryCode.open(); 
    } 

    public void open() 
    { 
     JPanel panel = new JPanel(); 
     panel.setMinimumSize(new Dimension(200,200)); 

     JFrame frame = new JFrame("JOptionPane showMessageDialog component example"); 
     System.out.println("open(): entry - With frame"); 
     JOptionPane.showConfirmDialog(frame, "Wow, works on the Mac!", "Inside open()", JOptionPane.YES_NO_OPTION); 
     System.out.println("Point 1"); 

     System.exit(0); 
    } 
} 

我看到的第一個系統脫節,並且代碼掛在消息框請求。在真實代碼中,我只是使用null作爲第一個參數。這個測試代碼的原始版本也使用了null,只是我正在試驗指定一個組件。我認爲這可能是問題所在。不是這樣。

當顯示SWT對話框時,有一種傾向,即單擊按鈕將掛起界面。掛起處於按下按鈕和事件處理程序觸發之間的某處。事件處理程序從不會觸發。

我沒有在這裏包含一個對話框。我認爲,由於我的確認/消息框顯示解決問題的相同問題,請免費獲取其他問題。

我在Google上搜索過在Mac上顯示java應用程序,但沒有任何結果。

我認爲將JRE/JDK更新到最新版本可以解決任何操作系統相關的問題。

我將代碼編譯爲jar並使用以下命令從終端窗口運行。我按Ctrl + C來完成掛起的應用程序。

的Java -XstartOnFirstThread罐子myTest.jar

的思考?

UPDATE

我刪除了原來的更新,但我離開了原來的問題,現在我明白這個問題更好。

真正的問題是如何啓動一個適當的Mac OSX Cocoa限制友好的SWT應用程序,它使用對話框和消息框。 (據我所知,顯示消息框的唯一方法是使用JOptionPane.show *,這是一個Swing的東西,因此可以將Swing和SWT混合起來。

有趣的是,問題始終存在與對話框(純粹是SWT實現)或消息框有關,前者的問題是調用事件處理程序的掛起,後者顯示消息框(null爲第一個參數,因爲不存在Swing框架。在SWT應用程序)

回答

1

不太確定這是否是錯誤,因爲我目前無法在我的Mac上測試它。但是你永遠不會將JFrame的可見性設置爲true。當您將框架作爲參數傳遞給JOptionPane時,窗格會嘗試顯示框架中的窗格。

所以嘗試:

public void open() 
{ 
    JFrame frame = new JFrame("JOptionPane showMessageDialog component example"); 
    System.out.println("open(): entry - With frame"); 
    frame.setSize(300,300); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 

    JOptionPane.showConfirmDialog(frame, "Wow, works on the Mac!", "Inside open()", JOptionPane.YES_NO_OPTION); 
    System.out.println("Point 1"); 

    System.exit(0); 
} 

而且爲什麼你創建的JPanel面板,據我看到的卻是從未使用過?

由於框架不可見,因此可能會導致問題。只是猜測... 這也可以解釋爲什麼它看起來像你的應用程序「凍結」。因爲它正在等待您在JOptionPane中進行選擇,但是由於無法看到JOptionPane,因此無法進行選擇。

我知道你寫過你也試過用null作爲參數,但我可以認爲這也可能導致問題,當沒有其他的JFrame顯示。正如我只是猜測一樣。試試吧,回到這裏來提供更多信息。

編輯 剛剛測試過,看起來像你的代碼很好。你的錯誤必須在你的Mac或Java設置中。

編輯2 我想我找到了你的答案。看起來startOnFirstThread是這裏的問題。我只是在命令行上通過javac和java進行測試。看看這個:

搖擺停止工作,因爲-XstartOnFirstThread意味着該
別人(極有可能是SWT)是要過來,並開始
抽與線程0事件循環CFRunLoop或類似的東西

這可以解釋爲什麼你的JOptionPane掙扎着顯示出來。 (來自:here

另外一個年紀大一點,但說明問題:

AWT的問題一般歸結爲哪個線程JVM啓動後。當使用java啓動(如PDE一樣)上蘋果,JAVA默認啓動第二個線程(這是AWT想要什麼),除非你指定-XstartOnFirstThread(這是S​​WT想要什麼)上。 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=212617)

+0

我可以在30分鐘內在我的Mac上進行測試。那麼我會盡快回復你。哦,也請確保你沒有設置任何斷點。 – dehlen 2015-02-18 16:11:37

+0

謝謝,但我沒有在Mac上運行Eclipse內部的代碼。我在Windows上構建代碼並使用Ant構建一個jar文件。然後將TeamViewer導入Mac並將jar文件複製到一個文件夾中。然後我使用「java -XstartOnFirstThread -jar 」從終端窗口啓動應用程序。沒有Eclipse,所以不可能設置斷點。 – 2015-02-18 16:17:26

+0

我剛剛編譯&在我的Mac上運行你的程序,一切正常。看起來像你的Mac/Java設置是錯誤的。 – dehlen 2015-02-18 16:56:12

1

的問題可能是,你是不是開始在EDT的GUI試試這個:

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      oEntryCode = new EntryCode(); 
      oEntryCode.open(); 
     } 
    }); 
} 

更多信息:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

另一個問題是使用-XstartOnFirstThread與Swing。Swing的作用相當於-XstartOnFirstThread正在做的事情,但以自己的方式。你不應該在Swing中使用-XstartOnFirstThread,就像混合SWT和Swing不是一個好主意。

如果您添加SwingUtilities.invokeLater()並刪除-XstartOnFirstThread,您的示例應該正常運行。

+0

投票了有人還爲時過早。測試表明不走,可悲。 – 2015-02-18 15:37:20

+0

@SarahWeinberger請看我的日期。 – whiskeyspider 2015-02-18 21:54:13