我仍然对空白 JOptionPane
有问题。根据 SO 和 Java Docs 的研究,这显然与不使用 EDT
有关。我的问题是 EDT
及其方法究竟如何应用于 JOptionPane
?例如,终端错误输出清楚地表明下面的 JOptionPane
没有在 EDT
上运行。具体缺少什么,Runnable
之类的东西如何适应?
import javax.swing.*;
public class PaneDemo
{
public static void main(String[] args)
{
final String[] TEXT ={
//message
"Hello, World!",
//title
"Greeting"};//end TEXT
showMyPane(TEXT);
}//end main
public static void showMyPane(final String[] TEXT)
{
JOptionPane.showMessageDialog(null, TEXT[0], TEXT[1],
JOptionPane.INFORMATION_MESSAGE);
if(!SwingUtilities.isEventDispatchThread())
{
System.err.println("Err: GUI failed to use EDT.");
}//end if(!SwingUtilities.isEventDispatchThread())
}//end showMyPane
}//end class PaneDemo
一个答案建议添加 invokeLater
。然而,这似乎在 BlueJ 中呈现得不是很好。
此外,isEventDispatchThread() 仍在终端中返回错误。仅仅是因为它现在位于错误的位置吗?
最佳答案
您可以在 Event Dispatch Thread 上创建 JOptionPane
像这样:
final String[] TEXT = {
//message
"Hello, World!",
//title
"Greeting"};//end TEXT
...
/**
* Create GUI and components on Event-Dispatch-Thread
*/
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, TEXT[0]
+ "\n is on EDT: " + SwingUtilities.isEventDispatchThread(), TEXT[1],
JOptionPane.INFORMATION_MESSAGE);
}
});
看看 Lesson: Concurrency in Swing 它应该可以帮助您了解它的全部内容
更新:
根据评论,您应该在 showPane(...)
方法中的每次调用时在 EDT
上启动 JOptionPane
,如下所示:
public static void showMyPane(final String[] TEXT) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, TEXT[0]
+ "\n is on EDT: " + SwingUtilities.isEventDispatchThread(), TEXT[1],
JOptionPane.INFORMATION_MESSAGE);
}
});
}//end showMyPane
public static void main(String[] args) {
final String[] TEXT = {
//message
"Hello, World!",
//title
"Greeting"};//end TEXT
showMyPane(TEXT);
}
关于java - 如何在 EDT 上运行 JOptionPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13093499/