Как сделать так, чтобы текст JLabel изменялся автоматически?

1

хорошо Когда вы загружаете банку, я хочу, чтобы она печаталась на jlabel%, загруженной до сих пор, но так, как я реализовал, когда я запускаю загрузку, она начинается с 0% времени, но даже после ее загрузки она не отображает новое преимущество.

heres мой код:

            while(( length = inputstream.read(buffer)) > -1)
            {
                down += length;
                bufferedoutputstream.write(buffer, 0 , length);
                String text = clientDL.label1.getText();
                int perc = getPerc();
                text = "Currently downloading , " + perc + "% finished...";
            }

и heres мой метод getPerc():

    private  int getPerc() {

    return  (down / (sizeOfClient + 1)) * 100;
}

Обновить:

я запустил его на отдельную нить, но все тот же

                while(( length = inputstream.read(buffer)) > -1)
            {
                down += length;
                bufferedoutputstream.write(buffer, 0 , length);
                thread = new Thread(new Runnable() {
                    public void run() {
                    clientDL.label1.setText("Downloading Client : " + getPerc() + " % Done.");
                    }
                });
            }
Теги:
multithreading
jlabel
swingworker

3 ответа

1
Лучший ответ

Автоматически было бы хорошо, но у вас будет небольшая работа, чтобы сделать свой прирост числа самостоятельно. Как было сказано ранее, у вас есть два варианта:

  • Используйте Thread, класс, который реализует Runnable или
  • Используйте SwingWorker, который расширяет SwingWorker, который также является потоком, но имеет встроенные возможности управления.

Если вы используете Thread, передайте JLabel в конструктор, чтобы иметь возможность легко изменять его текст по мере продвижения потока.

Если вы решите использовать SwingWorker, создайте внутренний класс, который выполняет работу и реализует doInBackground(), process() и done().

Вот два решения, использующие sleep(60) вместо загрузки файла в качестве задержки. Подставьте эту строку вызовом метода загрузки.

Подход SwingWorker:

public class LabelWorker extends JFrame {

    private class Task extends SwingWorker<Void, Integer> {

        @Override
        protected Void doInBackground() {
            val = 0;
            setProgress(0);
            while (val < 1000) {
                try {
                    Thread.sleep(60);
                } catch (InterruptedException ex) {
                }
                publish(val);
                setProgress((int) (val * 100. / 1000.));
                val++;
            }
            return null;
        }

        @Override
        protected void process(List<Integer> chunks) {
            progressLbl.setText(chunks.get(0).toString());
        }

        @Override
        public void done() {
            startBtn.setEnabled(true);
            setCursor(null);
            val = 1000;
        }
        private int val;

    }

    public LabelWorker() {
        setTitle("Worker");
        setLayout(new FlowLayout());
        startBtn = new JButton("Start");
        startBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                actionStart();
            }
        });
        stopBtn = new JButton("Stop");
        stopBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                actionStop();
            }
        });
        progressLbl = new JLabel("not running...");
        add(startBtn);
        add(stopBtn);
        add(progressLbl);
        pack();
    }

    private void actionStart() {
        Task task;
        startBtn.setEnabled(false);
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        task = new Task();
        task.execute();
        t = task;
    }

    private void actionStop() {
        startBtn.setEnabled(true);
        setCursor(null);
        t.cancel(true);
    }

    public static void main(String[] args) {
        new LabelWorker().setVisible(true);
    }
    private final JButton startBtn;
    private final JButton stopBtn;
    private final JLabel progressLbl;
    private Task t;
}

Подход Runnable thread:

public class ProgressingLabels extends JFrame {

    private class Loader implements Runnable {

        private final JLabel progress;

        public Loader(JLabel progress) {
            this.progress = progress;
            progress.setText("0");
        }

        @Override
        public void run() {
            int i = 0;
            while (i < 1000) {
                progress.setText(String.valueOf(++i));
                try {
                    TimeUnit.MILLISECONDS.sleep(60);
                } catch (InterruptedException ex) {
                    break;
                }
            }
        }
    }

    public ProgressingLabels() {
        startButton = new JButton("Start");
        stopButton = new JButton("Stop");
        progressLabel = new JLabel("0     ");

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        startButton.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                if ((wt == null) || (!wt.isAlive())) {
                    Loader ld = new Loader(progressLabel);
                    wt = new Thread(ld);
                    wt.start();
                } else {
                    JOptionPane.showMessageDialog(null, "Thread already running...");
                }
            }
        });
        add(startButton);

        stopButton.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                if ((wt != null) && (wt.isAlive())) {
                    wt.interrupt();
                }
                JOptionPane.showMessageDialog(null, "Thread interrupted\n" + (progressLabel.getText()) + " rounds.");
            }
        });
        add(stopButton);

        add(progressLabel);

        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ProgressingLabels().setVisible(true);
            }
        });
    }

    private final JButton startButton;
    private final JButton stopButton;
    private JLabel progressLabel;
    private Thread wt;
}

Классы потоков также могут быть записаны в отдельных файлах. Я помещал их во внутренние классы, чтобы сделать этот код более компактным.

Я думаю, что для загрузки файлов вам лучше использовать JProgressBar вместо JLabel.

0

в вашем цикле while вы можете сделать

label1.setText("Download percentage: " + perc)
0

Вы должны использовать другой поток. Вы записываете данные и обновляете пользовательский интерфейс в одном потоке, поэтому на экране не хватает времени для обновления.

Посмотрите на класс SwingWorker.

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

  • 0
    хорошо, я дал ему новую ветку, но она все та же; о проверить мой основной пост на новый код

Ещё вопросы

Сообщество Overcoder
Наверх
Меню