JOptionPane是否阻止事件线程

Gia*_*nis 3 java swing thread-safety joptionpane

我的应用程序JOptionPane在某些时候使用s来输入信息.在显示的同时JOptionPane,可以在通过网络从其他客户端制作的GUI上进行更改.这些可以是文本JTextArea,也可以是节点更改JTree.

这是否意味着我需要JOptionPane在新线程上创建,以便在JOptionPane激活期间所做的更改不会出现问题?

我在互联网上看了几个地方,但我得不到明确的答案.

ps JOptionPane是在用户单击按钮时创建的.

Rob*_*bin 6

Swing是单线程的,因此"使用另一个线程"的选项根本不是一个选项.但是,这并不意味着在显示选项窗格时无法更新组件.请参阅下面的示例.我添加了一个System.out调用来说明JOptionPane调用是阻塞的,但由于Swing计时器,我可以将文本追加到我的JTextArea(在EDT上).

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.Timer;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class UpdateOptionPane {

  private static void showUI(){
    final JFrame testFrame = new JFrame( "TestFrame" );

    final JTextArea textArea = new JTextArea(  );
    testFrame.add( new JScrollPane( textArea ), BorderLayout.CENTER );

    Timer timer = new Timer( 1000, new ActionListener() {
      @Override
      public void actionPerformed( ActionEvent e ) {
        textArea.append( "bla" );
      }
    } );
    timer.setRepeats( true );
    timer.start();
    JButton button = new JButton( "Click me" );
    button.addActionListener( new ActionListener() {
      @Override
      public void actionPerformed( ActionEvent e ) {
        System.out.println("Before option pane");
        JOptionPane.showMessageDialog( testFrame, "A message dialog" );
        System.out.println("After option pane");
      }
    } );
    testFrame.add( button, BorderLayout.SOUTH );
    testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    testFrame.pack();
    testFrame.setVisible( true );
  }

  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        showUI();
      }
    } );
  }
}
Run Code Online (Sandbox Code Playgroud)