2015-02-17 159 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