Java 如何在长时间运行的任务中显示消息?

Java 如何在长时间运行的任务中显示消息?,java,swing,Java,Swing,我想显示一系列消息几秒钟,然后在连接到DB时消失。在Java中如何做到这一点 第一条消息应该是“连接到数据库”,第二条消息应该是“创建数据库”,最后一条消息应该是“数据库创建成功” 这是这个类的代码。我只是想用一个弹出窗口来替换println语句,它会在几秒钟后关闭它 public class ExecuteSQL { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String

我想显示一系列消息几秒钟,然后在连接到DB时消失。在Java中如何做到这一点

第一条消息应该是“连接到数据库”,第二条消息应该是“创建数据库”,最后一条消息应该是“数据库创建成功”

这是这个类的代码。我只是想用一个弹出窗口来替换println语句,它会在几秒钟后关闭它

  public class ExecuteSQL {

   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/?allowMultiQueries=true";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "";



public static void connectExe() {

        Connection conn = null;
           Statement stmt = null;

           try{

              Class.forName("com.mysql.jdbc.Driver");

              System.out.println("Connecting to database...");
              conn = DriverManager.getConnection(DB_URL, USER, PASS);

              System.out.println("Creating database...");
              stmt = conn.createStatement();

              String sql = Domain.getCurrentDatabaseSQL();
              stmt.executeUpdate(sql);
              System.out.println("Database created successfully...");


           }catch(SQLException se){
              se.printStackTrace();
           }catch(Exception e){
              e.printStackTrace();
           }finally{

              try{
                 if(stmt!=null)
                    stmt.close();
              }catch(SQLException se2){
              }
              try{
                 if(conn!=null)
                    conn.close();
              }catch(SQLException se){
                 se.printStackTrace();
              }
           }//end try

    }

}  

我使用的是Swing。

有多种方式可以实际显示消息,您可以在玻璃窗格上使用
JPanel
,您可以使用无框窗口,您可以……但我们不必担心这一点

在Swing中触发未来事件的最简单和最好的方法可能是通过使用
javax.Swing.Timer
。它使用简单直接,在Swing中使用安全

Swing不是线程安全的,是单线程的。这意味着您永远不应该使用可能需要时间来运行或暂停EDT执行的代码来阻止事件调度线程,并且永远不应该从EDT外部和任何UI组件进行交互

javax.swing.Timer
是一种在不阻塞EDT的情况下等待指定时间段的好方法,但会在EDT的上下文中触发它的更新,使其易于使用,并且可以安全地从内部与UI组件交互

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class ShowMessage {

    public static void main(String[] args) {

        EventQueue.invokeLater(
                new Runnable() {
                    @Override
                    public void run() {
                        try {
                            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                        } catch (ClassNotFoundException ex) {
                        } catch (InstantiationException ex) {
                        } catch (IllegalAccessException ex) {
                        } catch (UnsupportedLookAndFeelException ex) {
                        }

                        final JFrame frame = new JFrame("Test");
                        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                        frame.setLayout(new GridBagLayout());
                        ((JComponent)frame.getContentPane()).setBorder(new EmptyBorder(20, 20, 20, 20));
                        frame.add(new JLabel("Boo"));
                        frame.pack();
                        frame.setLocationRelativeTo(null);
                        frame.setVisible(true);

                        Timer timer = new Timer(5000, new ActionListener() {
                            @Override
                            public void actionPerformed(ActionEvent e) {
                                frame.dispose();
                            }
                        });
                        timer.setRepeats(false);
                        timer.start();
                    }
                }
        );
    }

}
有关详细信息,请参阅和

已更新


如果您运行的背景长度未知,则可以使用
SwingWorker
。这将允许您在
doInBackground
方法中运行任务,完成后,将调用
done
方法,您可以关闭消息弹出窗口

很多都取决于您使用什么来显示消息,但总体思路是显示消息并启动计时器。当计时器启动时,您将关闭message@AndrewThompson当然可以,但是使用什么框架?@MadProgrammer:问题被标记为
swing
,所以我假设这就是我们的框架question@a_horse_with_no_name我肯定不是在我发表评论的时候PSo。。如果您还没有弄清楚,请使用基于Swing的(或者可能有几个,具体取决于具体的设计)。顺便说一句,如果这是关于实际登录到DB(而不是像您描述的那样只是模拟它),那么最好使用一个。