繁体   English   中英

使JOptionPane.showConfirmDialog()在Mac OSX上运行

[英]Getting JOptionPane.showConfirmDialog() to function on Mac OSX

我在获取消息框和某种程度上无法在Mac(v10.9.5)中正常显示/运行对话框时遇到麻烦。

我刚刚将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更新到最新版本将解决任何与OS相关的问题。

我将代码编译到jar中,并使用以下代码从终端窗口运行。 我按Ctrl + C完全挂起了应用程序。

java -XstartOnFirstThread -jar myTest.jar

思考?

更新

我删除了原来的更新,但现在我保留了原来的问题,因为我对问题有了更好的了解。

真正的问题是如何启动使用对话框和消息框的正确的Mac OSX Cocoa限制友好型SWT应用程序。 (据我所知,显示消息框的唯一方法是使用JOptionPane.show *,这是Swing的东西,因此将Swing和SWT混合在一起。

有趣的是,该问题始终与按钮有关,无论是在对话框中(纯SWT实现)还是在消息框中。 在前者中,问题是挂起调用事件处理程序,而后者则显示消息框(第一个参数为空,因为SWT应用程序中不存在Swing框架)。

问题可能是您没有在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 -XstartOnFirstThread使用。 Swing等效于-XstartOnFirstThread所做的事情,但是以其自己的方式。 您不应该将-XstartOnFirstThread与Swing -XstartOnFirstThread使用,因为将SWT和Swing混合并不是一个好主意。

如果添加SwingUtilities.invokeLater()并删除-XstartOnFirstThread ,则示例应正常运行。

由于目前无法在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在命令行上进行了测试。 看看这个:

Swing停止工作,因为-XstartOnFirstThread意味着
会有其他人(很可能是SWT)出现并开始
使用CFRunLoop等将事件循环泵入线程0

这可以解释为什么您的JOptionPane难以显示。 (摘自: 这里

还有些老,但描述了您的问题:

AWT问题通常归结于启动jvm的线程。 在Mac上使用Java启动器(如pde一样)时,默认情况下,java在第二个线程(这是AWT想要的)上启动,除非您指定-XstartOnFirstThread(这是S​​WT想要的)。 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=212617)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM