JButton só funciona uma vez [RESOLVIDO]

13 respostas
M

Olá!

Por favor, siga o código. Explicarei o erro abaixo do mesmo!

x.addActionListener(   
    	      new ActionListener(){   
    	        public void actionPerformed(ActionEvent e){   
    	                // Click BUTTON
    	        	// Componentes
    				
    	            JTextField txt = new JTextField("Informar comando");   
    	            add(txt); 
    	            
    	            JTextArea area = new JTextArea("");   
    	            add(area); 
    	            area.setBounds(10,10, 140, 50);
    	            area.setLocation(435, 35);
    	            txt.setBounds(10,10, 140, 25);
    	            txt.setLocation(435, 4);
    	            //
    	            // Define texto
    	        	area.setText(txt.getText() + "\n");  
    	        }   
    	      }

Então, tenho o button “Criar Console/Enviar”… ( x )
Na primeira vez que clico nele, como no código acima mostra, ele cria uma textarea e um textfield.
Então, define o texto da area com o que tem no textfield, no caso, “Informar comando”.

Até aí, está correto.
O problema, é que depois de criar tudo, quando alguém clicasse novamente no button “x”, era pra definir o texto da textarea com o textfield, mas isto não acontece.
Fica como se o button ficasse sem a função click… Eu clico e nada acontece…

Como posso resolver?
Agradeço!

13 Respostas

zoren

Pelo que eu entendi do seu código toda vez que vc clicar no botão ele vai criar e colocar os itens um em cima dos outros pq eles estão com a posição definida

É isso??

M

E é este o problema… ( desculpe, eu expliquei mal no 1° post… irei editá-lo…)

Eu gostaria que, no primeiro clique, o button criasse os componentes textfield e textarea. Que é o que ele faz.

Mas quê, no segundo clique, ele não fizesse isto. Simplesmente tivesse a ação de:

area.setText(txt.getText() + "\n");

Eu já tentei fazer a ação do button “x” criar um outro button com esta ação acima…
Mas ocorre um erro no “area.”

(area.) é o a variável que cria o textarea, o erro é que a variável está em outra classe…

edipokbelo

Mijuaho, deve ter algum modo de verificar se já existe o JButton ou JTextArea, como não conheço esse modo(se existir).
Eu sugiro que você crie uma variavel boolean, e crie um IF dentro da ação do botão.

M

Interessante a sugestão…
Se alguém souber como checar se componente existe, por favor, não deixe de escrever!

zoren

Simples, você declara o seu componente fora da ação do botão

assim na ação do botão você pergunta se ele é null, se sim vc instância ele, senão vc faz oq deseja

M

Botei os textarea e textfield fora do comando button…

Mas agora, com a linha de código abaixo, ( é a única ação do clique do button x )

area.setText(txt.getText() + "\n");

eu ganho este erro:

Cannot refer to a non-final variable area inside an inner class defined in a different method
Cannot refer to a non-final variable txt inside an inner class defined in a different method

Por favor, help… xD

zoren

vc colocou os campos no no escopo da classe??

coloca o código pra mim dar uma olhada

M

Vou dar o código inteiro, somente escondendo alguns textos (labels)…

import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.event.*;

public class Estudos extends JFrame{
	
	
	
  public Estudos() {
	  
	  
    super("Aqui_vai_o_nome_da_minha_janela");
    setSize(570, 350);
    setVisible(true);
    //
    super.setLocationRelativeTo(null); 
    //
    setLayout(null);
   
    
    JButton x = new JButton("Enviar!");
    add(x);

    x.setBounds(10,10, 135, 25);   


    x.setLocation(580,4);

    JTextField txt = new JTextField("Informar comando");   
    add(txt); 
    
    JTextArea area = new JTextArea("");   
    add(area); 
    area.setBounds(10,10, 140, 50);
    area.setLocation(435, 35);
    txt.setBounds(10,10, 140, 25);
    txt.setLocation(435, 4);
    
    
   //
    String icone = "favicon.png";
    this.setIconImage(new ImageIcon(icone).getImage());
    
    
    
    x.addActionListener(   
    	      new ActionListener(){  
    	    	  
    	        public void actionPerformed(ActionEvent e){   
    	                // Click BUTTON
    	        	// Componentes
    	        	
    	            
    	            //
    	            // Define texto
    	        	
                        area.setText(txt.getText() + "\n");
    	        	
    	            
    	            
    	            
    	            
    	        }   
    	      }   
    	    );  
    //
    
  }
zoren

Então, você vai ter q fazer algumas modificações na sua classe

1º - Você tem que declarar seus componentes fora do construtor

JTextField txt;

e outros, esse é apenas um exemplo

ai no construtor vc inicializa seus componentes

txt = new JTextField("Valor inicial", 20);
M

POST EDITADO:

Ok… Entendi!

zoren

Relaxa, normal quando a gente começa

Assim, as coisas q a gente usa pra programar tem o lugar onde elas são declaradas

  • na classe
  • nos métodos

Quando estão na classe todos podem ver essa variável
Quando estão no método, apenas os que estão no método podem vê-lo

Assim, vc tem q declarar os seus objetos na classe em vez de declarar no método

public class Teste{

       JTextField txt;

       public Teste(){
              txt = new JTextField("",30);
        }

}

Assim todos os membros de sua classe poderão ver quem é seu botão

É muito importante não esquecer de instânciar seus Objetos senão vc vai se deparar com o famoso NullPointerException

M

Opa agora funcionou de boa…

Valeu!

zoren

Não esquece de colocar resolvido no titulo do tópico

[edit]

cheguei tarde

Criado 10 de setembro de 2009
Ultima resposta 10 de set. de 2009
Respostas 13
Participantes 3