Thread.sleep travando JFrame

Então , o que eu queria fazer era: Quando eu Pressionar o JButton, ele vai setar esse mesmo JButton para setEnable(false); e daria um Thread.sleep(3000) e depois setEnable(true) novamente , eu estive lendo sobre Threads e vi que a solução seria criar uma outra Thread para não interromper a Thread principal do JFrame, ai eu tentei fazer isso:

Thread delay = new Thread (new Runnable(){

	        public void run() {
	            try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	           btnTeste.setEnabled(true);
	        }
	});
	delay.start();
	

	btnTeste.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			
			btnTeste.setEnabled(false);
			
		delay.start();
}
	});

mas ai no console aponta um erro e o não ativa nem o sleep nem o botão denovo… gostaria por favor que alguem me ajudace (eu não conheço muito bem Thread, então se puderem falar onde eu coloco a solução no código/explicar a solução eu agradeço)

Swing e threads não costumam se dar bem um com o outro. Não é à toa que a documentação diz que o Swing não é thread-safe.

Qual erro que você obtém no console?

Abraço.

Obrigado Pela resposta.

Hmm entendi, mas o pior é que não tem outro jeito de fazer o botão esperar para ficar ativo denovo a não ser com o Thread.sleep né?

Quando eu faço Run no programa, e clico no botão, acontece o seguinte erro:

Exception in thread “AWT-EventQueue-0” java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at Botao$3.actionPerformed(Botao.java:63)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

O thread não pode ser reaproveitado:

btnTeste.addActionListener(new ActionListener() {
 public void actionPerformed(ActionEvent arg0) {

  btnTeste.setEnabled(false);

  new Thread(new Runnable() {
   public void run() {
    try {
     Thread.sleep(3000);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    btnTeste.setEnabled(true);
   }
  }).start();
 }
});

Poderia tentar usar o JToggleButton

1 curtida

Funcionou Perfeitamente, muito obrigado diego12 e TerraSkilll pelas respostas

(e mesmo se eu tivesse usado o JToggleButton, teria que fazer o Thread.sleep do mesmo jeito xD)

Obrigadão!