我想在几秒钟内显示一系列消息,并在连接到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。
答案 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 Swing和How to Use Swing Timers
<强>更新强>
如果您运行的是未知长度的背景,则可以改用SwingWorker
。这将允许您使用doInBackground
方法运行任务,完成后,将调用done
方法,您可以关闭消息弹出窗口