请各位大虾帮忙,我想做一个进度条的效果程序,可是运行起来只有进度条的边框,边框里面是透明的,没有具体的进度显示。等运行完成后,进度条又显示出了最后的进度。不知道哪里错了。ProgressMonitor progress = new ProgressMonitor(this, null, "", 0, n+1);//n已经定义好,和下面循环体中的元素个数一致。
        progress.setNote("process...");
        progress.setMillisToDecideToPopup(0);
        progress.setMillisToPopup(1000);
        progress.setProgress(0);
        int num=0;
             while (m1.hasMoreElements()) { // m1在之前已定义。m1中的元素个数决定循环次数。循环体中大量相关代码省略。
                num++;
                progress.setProgress(num);
                System.out.println(num);
                try {
                    Thread.currentThread().sleep(100);
                } catch (Exception e1) {
                    System.out.println("ft");
                }
}

解决方案 »

  1.   

    简单,在progress.setProgress(num);的时候加个线程,呵呵,给分吧,兄弟。
      

  2.   

    like:progress.setNote("process...");
    progress.setMillisToDecideToPopup(0);
    progress.setMillisToPopup(1000);
    progress.setProgress(0);
    new Thread() {
        public void run() {
            int num=0;
            while (m1.hasMoreElements()) {
                num++;
                progress.setProgress(num);
                System.out.println(num);
                try {
                    Thread.currentThread().sleep(100);
                } catch (Exception e1) {
                    System.out.println("ft");
                }
            }
        }
    }.start();
      

  3.   

    这样似乎不妥,while体里面有很多代码和变量,这样一写,变量作用范围都发生了变化了
      

  4.   

    楼上说的是。与原结构比是需要大变动。
    但是,由于swing的单线程模型的缘故,必须把这些工作放在独立线程里。
      

  5.   

    请使用多线程。下面是我着的一个示例程序。jre1.6环境通过编译。
    //package components;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.beans.*;
    import java.util.Random;public class ProgressBarDemo extends JPanel
                                 implements ActionListener,
                                            PropertyChangeListener {    private JProgressBar progressBar;
        private JButton startButton;
        private JTextArea taskOutput;
        private Task task;    class Task extends SwingWorker<Void, Void> {
            /*
             * Main task. Executed in background thread.
             */
            @Override
            public Void doInBackground() {
                Random random = new Random();
                int progress = 0;
                //Initialize progress property.
                setProgress(0);
                while (progress < 100) {
                    //Sleep for up to one second.
                    try {
                        Thread.sleep(random.nextInt(1000));
                    } catch (InterruptedException ignore) {}
                    //Make random progress.
                    progress += random.nextInt(10);
                    setProgress(Math.min(progress, 100));
                }
                return null;
            }        /*
             * Executed in event dispatching thread
             */
            @Override
            public void done() {
                Toolkit.getDefaultToolkit().beep();
                startButton.setEnabled(true);
                setCursor(null); //turn off the wait cursor
                taskOutput.append("Done!\n");
            }
        }    public ProgressBarDemo() {
            super(new BorderLayout());        //Create the demo's UI.
            startButton = new JButton("Start");
            startButton.setActionCommand("start");
            startButton.addActionListener(this);        progressBar = new JProgressBar(0, 100);
            progressBar.setValue(0);
            progressBar.setStringPainted(true);        taskOutput = new JTextArea(5, 20);
            taskOutput.setMargin(new Insets(5,5,5,5));
            taskOutput.setEditable(false);        JPanel panel = new JPanel();
            panel.add(startButton);
            panel.add(progressBar);        add(panel, BorderLayout.PAGE_START);
            add(new JScrollPane(taskOutput), BorderLayout.CENTER);
            setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));    }    /**
         * Invoked when the user presses the start button.
         */
        public void actionPerformed(ActionEvent evt) {
            startButton.setEnabled(false);
            setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
            //Instances of javax.swing.SwingWorker are not reusuable, so
            //we create new instances as needed.
            task = new Task();
            task.addPropertyChangeListener(this);
            task.execute();
        }    /**
         * Invoked when task's progress property changes.
         */
        public void propertyChange(PropertyChangeEvent evt) {
            if ("progress" == evt.getPropertyName()) {
                int progress = (Integer) evt.getNewValue();
                progressBar.setValue(progress);
                taskOutput.append(String.format(
                        "Completed %d%% of task.\n", task.getProgress()));
            }
        }
        /**
         * Create the GUI and show it. As with all GUI code, this must run
         * on the event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new JFrame("ProgressBarDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        //Create and set up the content pane.
            JComponent newContentPane = new ProgressBarDemo();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);        //Display the window.
            frame.pack();
            frame.setVisible(true);
        }    public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }