我的应用程序JOptionPane
在某些时候使用 s 来输入信息。在显示的同时,JOptionPane
GUI 上可能会发生来自网络上其他客户端的更改。这些可以是 上的文本JTextArea
,或更改上的节点JTree
。
这是否意味着我需要JOptionPane
在新线程上创建,以便在活动期间所做的更改不会出现问题JOptionPane
?
我在互联网上查看了一些地方,但没有得到明确的答案。
psJOptionPane
在用户单击按钮时创建。
我的应用程序JOptionPane
在某些时候使用 s 来输入信息。在显示的同时,JOptionPane
GUI 上可能会发生来自网络上其他客户端的更改。这些可以是 上的文本JTextArea
,或更改上的节点JTree
。
这是否意味着我需要JOptionPane
在新线程上创建,以便在活动期间所做的更改不会出现问题JOptionPane
?
我在互联网上查看了一些地方,但没有得到明确的答案。
psJOptionPane
在用户单击按钮时创建。
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();
}
} );
}
}
JoptionPane 实际上是一种设置和使用 JDialog 的简单方法。听起来你想要的是一个非模态 JDialog