Usando Thread

Olá pessoal! Tudo bom com vocês?

Sempre soube o que era Thread mas nunca a compreendi…

Tentei usar uma thread para temporizar o crescimento de um painel mas não dá certo, esse codigo que posto é para demonstrar a situação.

package testesGUJ;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class ClassThread extends javax.swing.JFrame {
	private JPanel paPainel;
	private JLabel lbLabel;
	private JButton btBaixar;

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		
				ClassThread inst = new ClassThread();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
		
	}
		
	public ClassThread(){
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				paPainel = new JPanel();
				getContentPane().add(paPainel);
				paPainel.setBounds(0, 0, 407, 12);
				paPainel.setLayout(null);
				paPainel.setBackground(new java.awt.Color(0,128,255));
				{
					lbLabel = new JLabel();
					paPainel.add(lbLabel);
					lbLabel.setText("Label");
					lbLabel.setBounds(107, 83, 206, 105);
					lbLabel.setFont(new java.awt.Font("Tahoma",1,72));
				}
			}
			{
				btBaixar = new JButton();
				getContentPane().add(btBaixar);
				btBaixar.setText("Baixar");
				btBaixar.setBounds(141, 304, 122, 21);
			}
			
			btBaixar.addActionListener(new ActionListener()
			{
				@SuppressWarnings("deprecation")
				public void actionPerformed(ActionEvent e)
				{
					try{
					Thread t = new Thread();
					t.start();
					while(paPainel.getSize().getHeight()<379)
					{
						Thread.sleep(10);
						paPainel.setBounds(0,0,415,(int)paPainel.getSize().getHeight()+1);
					}
					t.stop();
					}
					catch(InterruptedException ex){ex.printStackTrace();}
				}
			});
		
			pack();
			this.setSize(415, 379);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

A intenção era que o painel fosse aumentando seu tamanho a medida que o laço vai sendo executado mas o tamanho do painel só é alterado depois do fim do processo.
Alguma luz?

Se o erro for absurdo, sintam-se livres para puxar minha orelha… :lol: :lol: :lol:

Ahem… não é melhor ler sobre o assunto antes de chutar como a classe Thread funciona?

  1. Você precisa passar um objeto do tipo Runnable no construtor da classe thread. Ou (não recomendado), você precisa fazer algo estender thread e sobrescrever o método run(). É o código desse Runnable que será disparado em outra thread;
  2. O método stop() é deprecated. Ao invés de adicionar um supressWarnings, você poderia ler o porque. Ele não deve ser usado quando estiver lidando com threads.
  3. Tome cuidado pois ações do Swing devem ser feitas apenas na thread do Swing. É para isso que existem métodos como EventQueue.invokeLater e EventQueue.invokeAndWait (ou, de mesmo nome na classe SwingWorker).

:shock: :shock: :shock:
Valeu vini, vou dar uma fuçada na net para entender detalhadamente como funciona… é que eu achava que era simples assim com fiz… mas valeu o puxão de orelha. :thumbup: :thumbup: :thumbup:

Alguém recomenda algum artigo, post ou tutorial:?:

Para utilizar a classe Thread você deve implementar o método run()
É nele que você deve inserir o trecho de código que deverá ser executado em um processo diferente…

Você pode procurar uma apostila ou livro completo(a) de Java. Com certeza terá um capítulo sobre Thread…

Boa sorte

Olá pessoal! Procurei saber mais sobre Thread e vi que não era como pensava mas ainda não consegui resolver o meu problema.

Testem esse codigo, parece perfeito mas não consigo alterar o tamanho do painel.

//**************************** GUI***
package testesGUJ;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class ClassThread extends javax.swing.JFrame implements Runnable {
	private JPanel paPainel;
	private JLabel lbLabel;
	private JButton btBaixar;
	public int aux=0;

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		
				ClassThread inst = new ClassThread();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
		
	}
		
	public ClassThread(){
		try {
			setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				paPainel = new JPanel();
				getContentPane().add(paPainel);
				paPainel.setBounds(0, 0, 407, 12);
				paPainel.setLayout(null);
				paPainel.setBackground(new java.awt.Color(0,128,255));
				{
					lbLabel = new JLabel();
					paPainel.add(lbLabel);
					lbLabel.setText("Label");
					lbLabel.setBounds(107, 83, 206, 105);
					lbLabel.setFont(new java.awt.Font("Tahoma",1,72));
				}
			}
			{
				btBaixar = new JButton();
				getContentPane().add(btBaixar);
				btBaixar.setText("Baixar");
				btBaixar.setBounds(141, 304, 122, 21);
			}
			
			btBaixar.addActionListener(new ActionListener()
			{
				
				public void actionPerformed(ActionEvent e)
				{
					ClassThread ct = new ClassThread();
					
					Thread t = new Thread(ct);
					t.start();
					
					
				}
			});
		
			pack();
			this.setSize(415, 379);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
//*************************GUI
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try{
			int n=0;
			while(aux<50)
			{
				aux++;
				//System.out.println(aux);
				Thread.sleep(100);
				n=(int)paPainel.getSize().getHeight()+1;
				System.out.println(n);
				paPainel.setSize(415,n);
				
			}
			
			}
			catch(Exception ex){ex.printStackTrace();}
		}

}

A intenção era fazer com que o painel aumente em 50 px

Tem como criar várias threads numa mesma classe?
Tipo uma classe que contenham somente threads e outras classes as utilizam.

Ninguém???

Tente trocar isso:

ClassThread ct = new ClassThread();   
Thread t = new Thread(ct);   
t.start();   

Por:

Thread t = new Thread(ClassThread.this);
t.start();

O que acontece é que sua classe desenha um painel, mas sua thread roda sobre outro painel (uma cópia, criada no new ClassThread()).

Tentei fazer isso que voce me disse Vinícius… não deu certo. Dá o seguinte erro: The constructor Thread(new ActionListener(){}) is undefined.

Isso no próprio Eclipse.

Ele pede que eu remova o this

Sorry, é que é assim: