setText (aparentemente) desnecessário em método

6 respostas
metodosbotaoactionlistenerjava
N

E ai pessoal!
Meu primeiro post, estou recém aprendendo Java e muita dúvida tirei aqui, mas agora preciso de um help!!

Preciso de um botão que gera outro botão idêntico ao ser clicado (vou lhes poupar dos detalhes e porquês).
Para isso tenho o código abaixo, que funciona:

public class Painel extends javax.swing.JFrame {
    
    Painel () {
        ... // Layout, closeOperation, setVisible, setSize, etc...
        add(new Botao());
    }
    
    class Botao extends javax.swing.JButton {
        
        Painel essePainel = Painel.this;
        
        
        Botao () {
            addActionListener((ActionEvent e) -> {
                essePainel.add(new Botao());         //se quem cria o novo botão é esse add
                setText("texto qualquer");           //porque esse setText??
            });
        }
    }
}

Preciso colocar aquele setText ali pra funcionar, se não simplesmente não cria novos botões!
Se eu deixo sem ele simplesmente não funciona!!!
Como me livro desse setText?

testei substituir o setText por setBackground e alguns outros métodos, nada…
testei criar outros objetos além de JButton, nada…
não posso usar um setText("") vazio, tem que ter algum caractere ao menos

desde já agradeço

6 Respostas

D

Provavelmente está criando, porém como não tem nenhum texto setado ele , acaba que não é possível ser visualizado, é oque acho.

N

Creio que não é o caso porque o setText está colocando o texto no botão que clico, e não no que é criado. Quando clico, o botão novo que aparece vem sem texto algum, o que cliquei que aparece o texto.

T

Ao invés de você criar uma classe que extend de JButton, é mais fácil e melhor criar um objeto JButton.

JButton botao1 = new JButton();
botao1.setText("Botao1");

botao1.addActionListener(e -> {
    JButton botao2 = new JButton();
    botao2.setText("botao2");
    essePainel.add(botao2);
                
});
N

preciso da implementação, esse aí é um resumo do código apenas, no programa que estou montando o construtor desse botão é maior
de qualquer forma, ainda acabo usando o setText, não queria precisar dele

N

Se alguém quiser replicar, esse código aqui compila e demonstra o problema:

import java.awt.FlowLayout;
import javax.swing.JButton;

public class Painel extends javax.swing.JFrame {

    static public void main(String[] args) {
        new Painel();
    }


    Painel essePainel = Painel.this;

    Painel () {
        setLayout(new FlowLayout());
        setVisible(true);
        setDefaultCloseOperation(3);
        setSize(400,400);

        JButton botao1 = new JButton();
        add(botao1);

        botao1.addActionListener(e -> {
            JButton botao2 = new JButton();
            botao1.setText("porque preciso setar esse texto??");
            essePainel.add(botao2);
            botao2.setText("pra criar esse botão");
            });
    }
}
G

Eu acredito que seria melhor assim:

public class Painel extends JPanel {
/* Não é necessário informar o caminho inteiro da herança, importa todo o swing. E seria interessante
 criar um JFrame dentro da classe que contém o método main  e ai você cria essa classe Painel extendendo JPanel */

public Painel () {
    inicializarComponentes();
    definirEventos();
}

public void inicializarComponentes() {
//Title, layout, etc
variabelBotao = new JButton("Texto do botão");
variavelBotao.setBounds(x, x, x, x); // Define onde ela vai ficar se o layout é null
this.add(variavelBotao);


  public void definirEventos() {
        //Aqui vai o código dos eventos do botão

}

Criado 11 de maio de 2017
Ultima resposta 13 de mai. de 2017
Respostas 6
Participantes 4