[英]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(这是SWT想要的)。 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=212617)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.