Olá. Estou com uma dúvida sobre Threads em java. Na verdade eu entendi na teoria o funcionamento das threads, os métods .wait() .sleep() .notify() etc… O problema é que não sei implementa-los na prática. Criei um exemplo simples, que possuí o mesmo problema que a aplicação que eu quero desenvolver.
Basicamente o problema é eu quero implementar uma barra de progresso ao programa, No caso ela fica na própria aplicação(não vem em uma janela de fora para exibir a porcentagem), só que o incrementador da barra não fica na mesma classe que a barra… ela é passada como parâmetro para outra classe que fará um processamento e deve retornar aos poucos o progresso desse processamento.
public class LoadBar extends javax.swing.JFrame{
private JProgressBar jProgressBar1;
private JLabel jPercent;
private JButton jButGo;
private JLabel jLabelProgress;
private Loader load = new Loader();
{
//Set Look & Feel
try {
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
LoadBar inst = new LoadBar();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public LoadBar() {
super();
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
{
jProgressBar1 = new JProgressBar();
getContentPane().add(jProgressBar1);
jProgressBar1.setBounds(22, 63, 220, 21);
jProgressBar1.setMinimum(1);
jProgressBar1.setMaximum(100);
jProgressBar1.setValue(1);
}
{
jLabelProgress = new JLabel();
getContentPane().add(jLabelProgress);
jLabelProgress.setText("Progress");
jLabelProgress.setBounds(22, 43, 50, 14);
}
{
jPercent = new JLabel();
getContentPane().add(jPercent);
jPercent.setText("0 % done");
jPercent.setBounds(248, 70, 62, 14);
}
{
jButGo = new JButton();
getContentPane().add(jButGo);
jButGo.setText("Load");
jButGo.setBounds(117, 101, 55, 23);
jButGo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try {
jButGoActionPerformed(evt);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
pack();
this.setSize(336, 189);
} catch (Exception e) {
//add your error handling code here
e.printStackTrace();
}
}
public void carregar() throws InterruptedException{
load.carregar(jProgressBar1, jPercent);
}
private void jButGoActionPerformed(ActionEvent evt) throws InterruptedException {
carregar();
}
}
public class Loader extends Thread {
public void carregar(JProgressBar pb, JLabel label) throws InterruptedException {
for (int i = 1; i <= 100; i++) {
sleep(100);
pb.setValue(i);
label.setText(i+"% done");
}
}
}
public class main {
public static void main(String[] args) throws InterruptedException{
LoadBar lb = new LoadBar();
lb.setVisible(true);
lb.setLocationRelativeTo(null);
}
}
Então a main, executa a janela de carga, que consiste apenas em uma janela com uma barra de carregamento e um botão para iniciar o processo de carga. Um outro objeto ira fazer um processamento e aos poucos ele deve indicar à barra quantos % da tarefa ele já resolveu. E a barra deve ser atualizada nesse período. Só que a barra não atualiza. Ela espera até o método terminar todo o processo, para daí sim, atualizar a barra. então ela vai de 0% para 100% e não de 0% à 100%
O que eu devo fazer? Obrigado.