本文介绍了如何自动关闭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 the defaultCloseOperation to DO_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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-14 23:41