本文介绍了如何自动关闭JOptionPane?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在运行一个Thread
,并且在thread
工作时,我想显示一个JOptionPane.showMessageDialog
,表示应用程序正在运行,并且在线程停止后,JOptionPane
将自动关闭,并且OK
按钮将一直处于禁用状态.我的主要代码:
I have a Thread
running and in the time while the thread
working i want to display a JOptionPane.showMessageDialog
saying that the application is working and after thread is stopped, JOptionPane
will close automatically and OK
button will be deactivated the whole time. My Main code :
class Index {
public static void main(String args[]) {
NewThread ob1 = new NewThread("One");
NewThread ob2 = new NewThread("Two");
NewThread ob3 = new NewThread("Three");
System.out.println("Thread One is alive: "+ ob1.t.isAlive());
System.out.println("Thread Two is alive: "+ ob2.t.isAlive());
System.out.println("Thread Three is alive: "+ ob3.t.isAlive());
while (ob1.t.isAlive()){
JOptionPane.showMessageDialog(null,"Thread One is alive");
}
System.out.println("Thread One is alive: "+ ob1.t.isAlive());
System.out.println("Thread Two is alive: "+ ob2.t.isAlive());
System.out.println("Thread Three is alive: "+ ob3.t.isAlive());
System.out.println("Main thread exiting.");
}}
当我运行它时,会显示JOptionPane
,但是除非我按下OK
按钮,否则他不会自动关闭.
And when i run it the JOptionPane
display but he won't close automatically unless i pressed OK
button.
class NewThread implements Runnable {
String name;
Thread t;
NewThread(String threadname) {
this.name = threadname;
this.t = new Thread(this, name);
System.out.println("New thread: " + t);
this.t.start(); // Start the thread
}
public void run() {
try {
for(int i = 5; i > 0; i--) {
System.out.println(name + ": " + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println(name + " interrupted.");}
System.out.println(name + " exiting.");
}}
推荐答案
- 不使用任何按钮创建自己的
Dialog
...确保将defaultCloseOperation
设置为DO_NOTHING
- 使用
ProgressMonitor
- Create your own
Dialog
without any buttons...make sure you set thedefaultCloseOperation
toDO_NOTHING
- Use a
ProgressMonitor
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JFrame;
import javax.swing.ProgressMonitor;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestProgress {
public static void main(String[] args) {
new TestProgress();
}
public TestProgress() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
new BackgroundWorker().execute();
}
});
}
public class BackgroundWorker extends SwingWorker<Void, Void> {
private ProgressMonitor monitor;
public BackgroundWorker() {
addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equalsIgnoreCase(evt.getPropertyName())) {
if (monitor == null) {
monitor = new ProgressMonitor(null, "Processing", null, 0, 99);
}
monitor.setProgress(getProgress());
}
}
});
}
@Override
protected void done() {
if (monitor != null) {
monitor.close();
}
}
@Override
protected Void doInBackground() throws Exception {
for (int index = 0; index < 100; index++) {
setProgress(index);
Thread.sleep(125);
}
return null;
}
}
}
对话框示例
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestProgress {
public static void main(String[] args) {
new TestProgress();
}
public TestProgress() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
new BackgroundWorker().execute();
}
});
}
public class BackgroundWorker extends SwingWorker<Void, Void> {
private JProgressBar pb;
private JDialog dialog;
public BackgroundWorker() {
addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equalsIgnoreCase(evt.getPropertyName())) {
if (dialog == null) {
dialog = new JDialog();
dialog.setTitle("Processing");
dialog.setLayout(new GridBagLayout());
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(2, 2, 2, 2);
gbc.weightx = 1;
gbc.gridy = 0;
dialog.add(new JLabel("Processing..."), gbc);
pb = new JProgressBar();
gbc.gridy = 1;
dialog.add(pb, gbc);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
pb.setValue(getProgress());
}
}
});
}
@Override
protected void done() {
if (dialog != null) {
dialog.dispose();
}
}
@Override
protected Void doInBackground() throws Exception {
for (int index = 0; index < 100; index++) {
setProgress(index);
Thread.sleep(125);
}
return null;
}
}
}
这篇关于如何自动关闭JOptionPane?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!