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

时间:2014-09-20 06:54:24

标签: java swing

我想在几秒钟内显示一系列消息,并在连接到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。

1 个答案:

答案 0 :(得分:1)

有多种方法可以实际显示消息,你可以在玻璃窗格上使用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();
                    }
                }
        );
    }

}

有关详细信息,请参阅Concurrency in SwingHow to Use Swing Timers

<强>更新

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