java – JProgressBar太快了
发布时间:2020-12-15 08:48:37 所属栏目:Java 来源:网络整理
导读:我正在尝试添加进度条.一切正常,我没有任何错误.但进度条从0%变为100%,甚至没有通过它之间的值(我的意思是它太快了,用户无法看到进度条块填写) pr = new JProgressBar(); pr(0); pr(true);..public void iterate(){ while (i=20000){ pr.setValue(i); i=i+
我正在尝试添加进度条.一切正常,我没有任何错误.但进度条从0%变为100%,甚至没有通过它之间的值(我的意思是它太快了,用户无法看到进度条块填写)
pr = new JProgressBar(); pr(0); pr(true); .. public void iterate(){ while (i<=20000){ pr.setValue(i); i=i+1000; try{ Thread.sleep(150); }catch (Exception e){ e.printStackTrace(); } } } 单击i按钮时,我调用iterate()方法,我希望它能逐步更新进度条.相反,它会暂停一段时间,然后显示一个完整的进度条. 我怎么解决这个问题? 2.)我不喜欢进度条选项卡的默认蓝色.我需要改变颜色.我试过pr.setForeground(Color.GRAY); 解决方法
问题是,您正在尝试在事件调度线程的上下文中更新进度.
这基本上意味着当您处于循环中时,EDT无法处理您正在进行的任何绘制请求. 您需要做的是如何将工作卸载到单独的线程并根据需要更新进度条.这个问题是,你永远不应该从EDT以外的任何线程更新UI. 但是不要绝望,你有很多选择,最好是使用Swing Worker 更新了示例 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)); pbProgress = new JProgressBar(); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(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; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |