хорошо Когда вы загружаете банку, я хочу, чтобы она печаталась на 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.");
}
});
}
Автоматически было бы хорошо, но у вас будет небольшая работа, чтобы сделать свой прирост числа самостоятельно. Как было сказано ранее, у вас есть два варианта:
Если вы используете 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.
в вашем цикле while вы можете сделать
label1.setText("Download percentage: " + perc)
Вы должны использовать другой поток. Вы записываете данные и обновляете пользовательский интерфейс в одном потоке, поэтому на экране не хватает времени для обновления.
Посмотрите на класс SwingWorker.
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html