【问题标题】:Does JOptionPane block Event threadJOptionPane 是否阻塞事件线程
【发布时间】:2012-04-21 15:31:13
【问题描述】:

我的应用程序在某些时候使用JOptionPanes 来输入信息。 在显示JOptionPane 的同时,GUI 上可能会发生来自网络上其他客户端的更改。这些可以是JTextArea 上的文本,或JTree 上更改的节点。

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

我在网上看了几个地方,但没有得到明确的答案。

p.s JOptionPane 是在用户单击按钮时创建的。

【问题讨论】:

  • 在哪个线程中调用 JOptionPane 并不重要。它将在 UI 线程中运行
  • 我试过了,没有问题,尽管可能不是“总是”有问题..

标签: java swing thread-safety joptionpane


【解决方案1】:

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();
      }
    } );
  }
}

【讨论】:

  • 感谢您向我介绍我不知道的 Timer 类!
【解决方案2】:

JoptionPane 实际上是一种设置和使用 JDialog 的简单方法。听起来你想要的是一个非模态的 JDialog

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多