0

我想仅在一定时间后才显示此 JOptionPane 的按钮“确定”(例如5 秒)。(我的目标实际上是让在另一个线程后面完成一些线程工作)

JOptionPane jop2 = new JOptionPane();   
jop2.showMessageDialog(null, "Please wait 5s", "WAIT", JOptionPane.INFORMATION_MESSAGE);

我完全不知道该怎么做,你能给我一些可以解决这个问题的代码吗?非常感谢您!

4

3 回答 3

4

没有特定的方法可以使用JOptionPane. 您必须创建一个自定义对话框并在固定时间后显示“确定”按钮。您可以使用一次Swing 计时器

ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        button.setVisible(true);
    }
};

Timer timer = new Timer(0, taskPerformer);
timer.setInitialDelay(5000);
timer.setRepeats(false);
timer.start();
于 2012-08-29T22:16:58.027 回答
1

听起来您正在寻找的是SwingWorker和的组合ProgressMonitor。将SwingWorker执行您长时间运行的任务(5 秒的任务),并使用ProgressMonitor. 可以在这里找到一个向您展示如何让两者一起工作的示例: getting the cancel event of Java ProgressMonitor

当然,如果您确信要在工作完成后采用显示继续按钮的方法,那么这里有一个示例可以让您朝着正确的方向开始。您将使用 aSwingWorker来提醒您的 Dialog 长时间运行的后台任务已完成。

import java.awt.*;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import javax.swing.*;

public class TempProject extends Box{

    public TempProject(){
        super(BoxLayout.Y_AXIS);

        //Contains the content of the Alert Dialog
        Box info = Box.createVerticalBox();
        info.add(new Label("Please wait 5 seconds"));
        final JButton continueButton = new JButton("Continue");
        info.add(continueButton);

        //The alert to wait 5 seconds
        final JDialog d = new JDialog();
        d.setTitle("WAIT");
        d.setModalityType(ModalityType.APPLICATION_MODAL);
        d.setContentPane(info);
        d.pack();

        //The action of the "Continue Button"
        continueButton.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                d.dispose();
            }
        });
        continueButton.setVisible(false);

        //Thread That Does Work
        final SwingWorker sw = new SwingWorker<Integer, Integer>()
        {
            protected Integer doInBackground() throws Exception  {
                //Do long running thread work here
                int i = 0;
                while (i++ < 100) {
                    System.out.println(i);
                    Thread.sleep(100);
                }
                return null;
            }

            @Override
            protected void done(){
                // What to do when the long runnng thread is done
                continueButton.setVisible(true);
            }


        };


        //Button to start the long running task
        JButton button = new JButton("Click Me");
        button.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) {
                sw.execute();
                d.setVisible(true);
            }});
        add(button);
    }


    public static void main(String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                frame.setContentPane(new TempProject());
                frame.setPreferredSize(new Dimension(500, 400));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }   


}
于 2012-08-30T04:27:03.023 回答
-1

你可以使用这样的东西来停止代码 5 秒

       try {
            Thread.sleep(5000); // do nothing for 5000 miliseconds (5 seconds)
        } catch (InterruptedException e) {
            e.printStackTrace();
       }
于 2012-08-29T22:20:23.213 回答