JProgressBar travada

5 respostas
J

Pessoal,

estou com um problema no JProgressBar: Qdo eu executo o Runtime.getRuntime().exec() a minha ProgressBar fica parada, sendo que eu a coloquei em uma nova Thread, na verdade todo o meu JFrame fica parado esperando o Runtime.getRuntime().exec() terminar, ja tentei colocar a ProgresseBar em uma Thread e o Runtime.getRuntime().exec() em outra Thread, mas o problema continua o mesmo.

ControladorIGrafu.phyml.getJProgressBar().setVisible(true);
Thread tThread = new Thread(new Runnable() {
	public void run() {
		ControladorIGrafu.phyml.getJProgressBar().setIndeterminate(true);
	}
	});
tThread.start();
new ControlaExecucao().executaPHYML();

A minha progressBar serve so pra ficar alguma coisa se movendo na interface gráfica pro usuário não achar que travou. Sim mas vamos ao problema…

Eu preciso que ela funcione qdo o Runtime.getRuntime().exec() do método ControlaExecucao().executaPHYML() estiver executando, mas ela fica travada enquanto o Runtime.getRuntime().exec() executa, não entendo o por que, sendo que ela está em uma nova Thread.
Se alguém puder me ajudar…
flw

5 Respostas

fabiofalci

Olá!

Tenta colocar o teu processo em uma Thread!

Olha esse exemplo que copia um arquivo:

public class ProgressBarTest extends JPanel implements ActionListener {

	JProgressBar progress;
	Timer timer;
	boolean sum = true;
	JButton button;

	public ProgressBarTest() {
		this.progress = new JProgressBar();
		this.progress.setPreferredSize(new Dimension(200, 22));
		this.progress.setStringPainted(true);
		this.progress.setString("");
		this.add(this.progress);

		JButton button = new JButton("Copy!");
		button.setPreferredSize(new Dimension(75, 22));
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				go();
			}
		});
		this.add(button);
	}

	public void go() {
		if (this.timer == null) {
			this.timer = new Timer(50, this);
		}

		if (!this.timer.isRunning()) {
			new Thread(new Runnable() {
				public void run() {
					progress.setString("Copying");
					timer.start();
					try {
						copy();
					} catch (Exception e) {
						e.printStackTrace();
					}
					timer.stop();
					progress.setValue(0);
					progress.setString("OK");
				}
			}).start();
		}
	}

	public void copy() throws Exception {
		FileInputStream fin = new FileInputStream(
				"/tmp/eclipse/eclipse-SDK-3.3.1-win32.zip");

		FileOutputStream fout = new FileOutputStream("/tmp/eclipse/tmp.zip");

		FileChannel in = fin.getChannel();
		FileChannel out = fout.getChannel();

		long numbytes = in.size();

		in.transferTo(0, numbytes, out);
		in.close();
	}

	public void actionPerformed(ActionEvent e) {
		int value = this.progress.getValue();
		if (value == 100) {
			this.sum = false;
		} else if (value == 0) {
			this.sum = true;
		}

		if (this.sum) {
			value += 2;
		} else {
			value -= 2;
		}
		this.progress.setValue(value);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setContentPane(new ProgressBarTest());
		frame.setSize(300, 70);
		frame.setVisible(true);
	}
}
J

mas a minha ja está rodando em um Thread… igual a sua, mas msm assim ela não atualiza…
ja me falaram q eu teria q fazer outra Thread pra ficar atualizando a progressBar, como seria essa atualização…?
flw

fabiofalci

Olha ali um exemplo de como eu atualizei. Usei a classe javax.swing.Timer

this.timer = new Timer(50, this);

Que a cada 50 milliseconds chama o método actionPerformed que atualiza a progressbar.

J

mesmo utilizando seu TImer qdo executo o Runtime.getRuntime().exec() a prograssBar continua travada, acabei de tentar com o timer, e nada, so começa a movimentar depois q o Runtime.getRuntime().exec() termina de executar, mas eu preciso da progressBar no momento da execução.

valeu… se souberem de mais alguma dica…

flw

F

Dá uma olhada em Observer Pattern. Resolveu meu problema…
Você implementa o Observer na classe da GUI e envia as notificações das classes de execução para o seu formulário Swing.

// Classe do Formulário
public class GUI extends JFrame implements Observer {

@Override
public void update(Observable o, Object arg) {
	if (arg instanceof Integer) {
		if ((Integer) arg > 100) {
			progressBar.setMaximum(((Integer) arg).intValue());
		} else {
			progressBar.setValue( ((Integer) arg).intValue());
		}
	} else if (arg instanceof Double) { 
		if ((Double) arg > 100) {
			progressBar.setMaximum(((Double) arg).intValue());
		} else {
			progressBar.setValue( ((Double) arg).intValue());
		}
	} else if (arg instanceof Boolean) {
		progressBar.setValue(0);
		statusBox.append("Processo de geração concluído! \n");
		statusBox.append("O programa de gravação de iso será iniciado!");
	} else if (arg == null) {
			statusBox.append("Processo iniciado...");
	}
}

}

// Classe de execução

public class Generate extends Observable implements Runnable {

// Constructor

public Generate(Observer observer) {

addObserver(observer);

}
// Implementação do Runnable

public void run() {

()

notifyObservers(new Integer(1));       // 1 é o progresso atual, mas pode ser um valor qualquer entre o mínimo e o máximo do progress

setChanged(); // Faz a atualização da GUI

}

}

Estes são apenas fragmentos do código, mas com uma pesquisa breve na internet é possível observar o funcionamento e gerar a implementação.

Criado 19 de novembro de 2007
Ultima resposta 29 de set. de 2010
Respostas 5
Participantes 3