JOptionPane:在一段时间后显示“Ok”按钮

时间:2012-08-29 22:14:33

标签: java swing button wait joptionpane

我想在一段时间后显示此JOptionPane按钮“OK”(例如, 5秒)。 (我的目的实际上是让这个其他线程完成一些线程工作)

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

我根本不知道如何做到这一点,你能为我提供一些能解决这个问题的代码吗? 非常感谢你提前!

3 个答案:

答案 0 :(得分:4)

使用JOptionPane没有具体方法可以做到这一点。您必须创建自定义对话框并在固定时间后显示“确定”按钮。您可以使用Swing timer的一次传递。

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

答案 1 :(得分:1)

听起来你正在寻找的是SwingWorkerProgressMonitor的组合。 SwingWorker将执行您长时间运行的任务(5秒钟),并使用ProgressMonitor通知用户它的进展情况。可以在此处找到一个示例,说明如何使两者协同工作: getting the cancel event of Java ProgressMonitor

当然,如果您确信在完成工作后想要采用显示“继续”按钮的方法,这里的示例应该可以帮助您开始正确的方向。您将使用SwingWorker提醒您的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);
            }
        });
    }   


}

答案 2 :(得分:-1)

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

       try {
            Thread.sleep(5000); // do nothing for 5000 miliseconds (5 seconds)
        } catch (InterruptedException e) {
            e.printStackTrace();
       }