【发布时间】:2017-03-25 23:43:07
【问题描述】:
我的目标:从数据库加载时的进度条
我目前正在制定一个日程安排程序,我的一位经理将使用该程序有多种用途,但主要是为员工设置每周日程安排。从远程位置访问 SQL 数据库 时,加载显然需要一秒钟以上的时间,我想向用户提供一些反馈,以便他们知道程序仍在运行。
我真的很想要一个进度条来显示表中在加载时已加载的行占总行数的百分比,但我不知道这是否可能。我在想诸如 JProgressBar 之类的不确定的东西,它只是在建立连接和处理结果集时移动。谢谢!
代码
以下代码是连接 SQL 数据库并处理结果集的方法:
public static String[][] getEmps(String sqlQuery) {
String[][] employee = new String[countRows("SELECT COUNT(*) FROM employee;")][10]; //creates array for employees
ResultSet rs = null; //declares result set
try(Connection conn = DriverManager.getConnection(url,uname,pass)) { //connects to database
Integer count = 0;
try(Statement stmt = conn.createStatement()) {
rs = stmt.executeQuery(sqlQuery);
while (rs.next()){
employee[count][0] = rs.getString("fname"); //Employee's First Name
employee[count][1] = rs.getString("lname"); //Employee's Last Name
employee[count][2] = String.valueOf(rs.getInt("enum")); //Employee's Employee ID
employee[count][3] = rs.getString("dept"); //Employee's Department
employee[count][4] = rs.getString("position"); //Employee's Position in Dept
employee[count][5] = String.valueOf(rs.getInt("class")); //Employee's Class
employee[count][6] = String.valueOf(rs.getInt("cashNum")); //Employee's Cashier Num
employee[count][7] = String.valueOf(rs.getInt("assNum")); //Employee's Assistant Num
employee[count][8] = String.valueOf(rs.getInt("age")); //Employee's Age
employee[count][9] = String.valueOf(rs.getDate("dob")); //Employee's Date of Birth
count++;
}
return employee;
}catch (SQLException ex) { //Prints Errors When DB Connection Fails
System.err.println("SQLException: " + ex.getMessage());
System.err.println("SQLState: " + ex.getSQLState());
System.err.println("VendorError: " + ex.getErrorCode());
System.exit(1);
}
}catch (SQLException ex) { //Prints Errors When DB Connection Fails
System.err.println("SQLException: " + ex.getMessage());
System.err.println("SQLState: " + ex.getSQLState());
System.err.println("VendorError: " + ex.getErrorCode());
System.exit(1);
}
return null;
}
...以及我希望出现并显示进度的进度条类:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.image.BufferedImage;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Dimension;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.JLabel;
import javax.swing.border.TitledBorder;
import java.awt.Font;
import java.awt.Color;
import java.awt.Cursor;
public class ProgressBar extends JFrame {
private JPanel contentPane;
private JPanel pnlProgressBar;
private String title = null;
private ProgressBar progressWindow = this;
private BufferedImage icon;
private JProgressBar progressBar;
private JPanel panel;
private JPanel panel_1;
public static void main(String[] args){
ProgressBar progressbar = new ProgressBar("TEST");
}
public JProgressBar getProgressBar() {
return progressBar;
}
public ProgressBar(String title){
this.title = title;
mbOSBoot.setLaf();
initialize();
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
setVisible(true);
}
private void initialize() {
setTitle("Loading.");
setPreferredSize(new Dimension(400, 125));
setLocationRelativeTo(null);
setBounds(new Rectangle(0, 0, 400, 125));
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 400, 125);
//Animates a Loading... as title of window
class AnimatedLoading extends TimerTask {
@Override
public void run() {
String currTitle = progressWindow.getTitle();
switch(currTitle){
case "Loading.": progressWindow.setTitle("Loading..");
break;
case "Loading..": progressWindow.setTitle("Loading...");
break;
case "Loading...": progressWindow.setTitle("Loading.");
break;
}
}
}
EventQueue.invokeLater(new Runnable() {
public void run() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new AnimatedLoading(), 0, 1000);
}
});
//End Window Animation
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
{
pnlProgressBar = new JPanel();
pnlProgressBar.setBorder(new TitledBorder(null, title, TitledBorder.LEADING, TitledBorder.TOP, null, new Color(59, 59, 59)));
contentPane.add(pnlProgressBar, BorderLayout.CENTER);
pnlProgressBar.setLayout(new BorderLayout(0, 0));
{
progressBar = new JProgressBar(0,100);
progressBar.setFont(new Font("SansSerif", Font.BOLD, 13));
progressBar.setStringPainted(false);
pnlProgressBar.add(progressBar);
progressBar.setVisible(true);
}
{
panel = new JPanel();
pnlProgressBar.add(panel, BorderLayout.NORTH);
}
{
panel_1 = new JPanel();
pnlProgressBar.add(panel_1, BorderLayout.SOUTH);
}
}
}
}
编辑 3/26/17
所以,我意识到我遗漏了一些重要信息...方法 getEmps() 正在被另一个类调用,需要为它提供结果 String[][] 来创建 GUI。我是否必须在调用getEmps() 方法的类中包含有关 SwingWorker 等的所有代码,还是为了组织起见我可以在单独的类中执行此操作?调用getEmps()方法的代码如下:
if(SQLDatabase.countRows("SELECT COUNT(*) FROM employee;") == 0){
JOptionPane.showMessageDialog(null, "No Employees Could Be Found in the Database. If You Believe This is an Error, Please Contact Your Network Administrator");
}else{
for(int i = 0; i < SQLDatabase.countRows("SELECT COUNT(*) FROM employee;"); i++){
String[][] emps = new String[SQLDatabase.countRows("SELECT COUNT(*) FROM employee;")][10];
emps = SQLDatabase.getEmps();
EmployeeInfoPanel empInfoPanel = new EmployeeInfoPanel(pnlViewPane, emps, i, title, frmGuiAllEmps);
}
}
【问题讨论】:
标签: java swing event-dispatch-thread jprogressbar