Mat*_*t B 3 java swing joptionpane event-dispatch-thread
我还有空白问题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
Run Code Online (Sandbox Code Playgroud)
答案建议添加invokeLater.然而,这似乎并没有在BlueJ中表现得很好.

isEventDispatchThread()仍然在终端中返回错误.这只是因为它现在在错误的位置?
Dav*_*amp 10
您可以JOptionPane在Event Dispatch Thread上创建如下:

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);
}
});
Run Code Online (Sandbox Code Playgroud)
看一下课程:Swing中的并发性应该可以帮助你理解它的全部内容
更新:
按照意见,你应该开始JOptionPane对EDT在每次调用showPane(...)像这样的方法:
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);
}
Run Code Online (Sandbox Code Playgroud)