我正在使用JProgressBar显示进度。但是,如何显示ProgressBar从0加载到100?我从互联网上获取了代码,但没有加载ProgressBar,但它可以正常工作。
码
progressFrame = new JFrame(); // frame to display progress bar progressBar = new JProgressBar(0,100); progressBar.setValue(0); progressBar.setStringPainted(true); progressFrame.add(progressBar); new SwingWorker<Void,Void>() { protected Void doInBackground() throws SQLException, ClassNotFoundException { Class.forName("oracle.jdbc.driver.OracleDriver"); progressBar.setValue(0); frame.setEnabled(false); // frame = main frame //tableclass creates a JTable with data from database tableclass = new TheDatabaseTable(deptName);//it takes time to create progressBar.setValue(50); frame.getContentPane().removeAll(); frame.setContentPane(tableclass); frame.validate(); frame.repaint(); progressBar.setValue(100); //progressFrame.dispose(); return null; }; protected void done() { //progressFrame.setVisible(false); frame.setVisible(true); progressFrame.dispose(); frame.setEnabled(true); } }.execute();
如果有人编辑上面的代码可以正常工作,我将不胜感激。谢谢。
你必须为此使用线程。设计一个实现Runnable接口的类,该接口将更新这样的值。
Runnable
class ProgressBarUpdator implements java.lang.Runnable { /** * Progress bar that shows the current status */ private javax.swing.JProgressBar jpb = null; /** * Progress bar value */ private java.lang.Integer value = null; /** * Constructor * @param jpb The progress bar this has to update */ public ProgressBarUpdator(javax.swing.JProgressBar jpb) { this.jpb = jpb; jpb.setMaximum(100); } /** * Sets the value to the progress bar * @param value Value to set */ public void setValue(java.lang.Integer value) { this.value = value; } /** * Action of the thread will be executed here. The value of the progress bar will be set here. */ public void run() { do { if (value != null) { jpb.setValue((int)java.lang.Math.round(java.lang.Math.floor(value.intValue() * 100 / maximum))); } try { java.lang.Thread.sleep(100L); } catch (java.lang.InterruptedException ex) { ex.printStackTrace(); } } while (value == null || value.intValue() < jpb.getMaximum()); } }
并在你的框架类中progressBar与新类一起使用
ProgressBarUpdator ju = new ProgressBarUpdator(progressBar); new java.lang.Thread(ju).start();
每当你想更改值时,只需使用以下语句
ju.setValue([Value to set]);
你拥有的代码违反了Swing的单一线程规则,因此是一个不好的例子。
你可以通过选择许多选项SwingWorker。你可以publish使用进度并使用该process方法更新进度条,也可以使用PropertyChangeListener和监视通过调用的setProgress方法创建的进度更改事件。SwingWorker
SwingWorker
publish
process
PropertyChangeListener
setProgress
import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingWorker; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.EmptyBorder; public class SwingWorkerProgress { public static void main(String[] args) { new SwingWorkerProgress(); } public SwingWorkerProgress() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JProgressBar pbProgress; private JButton start; public TestPane() { setBorder(new EmptyBorder(10, 10, 10, 10)); pbProgress = new JProgressBar(); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(4, 4, 4, 4); gbc.gridx = 0; gbc.gridy = 0; add(pbProgress, gbc); start = new JButton("Start"); gbc.gridy++; add(start, gbc); start.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start.setEnabled(false); ProgressWorker pw = new ProgressWorker(); pw.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String name = evt.getPropertyName(); if (name.equals("progress")) { int progress = (int) evt.getNewValue(); pbProgress.setValue(progress); repaint(); } else if (name.equals("state")) { SwingWorker.StateValue state = (SwingWorker.StateValue) evt.getNewValue(); switch (state) { case DONE: start.setEnabled(true); break; } } } }); pw.execute(); } }); } } public class ProgressWorker extends SwingWorker<Object, Object> { @Override protected Object doInBackground() throws Exception { int i = 0; int max = 2000; while (i < max) { i += 10; int progress = Math.round(((float)i / (float)max) * 100f); setProgress(progress); try { Thread.sleep(25); } catch (Exception e) { e.printStackTrace(); } } return null; } } }