Hola, he estado usando netbeans y las funciones swing por un tiempo. Recientemente agregué un JPanel a mi marco J simplemente arrastrando y soltando. Luego también agregué un botón. Escribí el siguiente código tratando de agregar texto al Panel cuando se hace clic en el botón. A continuación se muestra el código que he utilizado.

public void addTextTry(){
        JLabel l1 = new JLabel("The add method appends an element to an array.");
        JLabel l2 = new JLabel("This inturn increases the arrays size.");
        jPanel1.add(l1);
        jPanel1.add(l2);
    }

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        addTextTry();
    }  

No recibo un mensaje de error y si agrego algo más al código, como agregar texto a un cuadro de texto, esto funciona. He comprobado si hay errores tontos, como tener los nombres del panel y el botón incorrectos, pero todo es correcto. ¿Alguien puede ver o sugerir por qué el texto no aparece en el panel cuando se hace clic en el botón?

0
Tom 26 ene. 2016 a las 17:30

2 respuestas

La mejor respuesta

Creo que necesitaría llamar a jPanel1.revalidate () después de agregar las etiquetas al panel para que se vuelva a aplicar el diseño.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


public class DisplayMessageTrial extends JFrame {

private JPanel jPanel1;
private JButton button = new JButton("Click Me!");

public DisplayMessageTrial() {
    super("DisplayMessageTrial");
    jPanel1 = new JPanel();
    jPanel1.add(button);
    setContentPane(jPanel1);
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            jButton1ActionPerformed(e);
        }
    });
}

public void addTextTry(){
    JLabel l1 = new JLabel("The add method appends an element to an array.");
    JLabel l2 = new JLabel("This inturn increases the arrays size.");
    jPanel1.add(l1);
    jPanel1.add(l2);
    jPanel1.revalidate();
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    addTextTry();
}  


public static void main(String[] args) {
    DisplayMessageTrial trial = new DisplayMessageTrial();
    trial.setBounds(100, 100, 300, 300);
    trial.setVisible(true);
}

}
1
Simon White 26 ene. 2016 a las 15:08

Antes de agregar las etiquetas al panel, es posible que desee borrarlo primero con removeAll (bueno, a menos que desee dejar los elementos secundarios existentes que puede haber agregado de antemano).

Después de agregar las etiquetas al panel, debe notificar al panel de su nuevo contenido con revalidate, para que vuelva a calcular su diseño y vuelva a pintar los componentes.

Finalmente, debe decirle al panel que se repaint.

Poniéndolo todo junto, su método se vería así:

public void addTextTry(){
        JLabel l1 = new JLabel("The add method appends an element to an array.");
        JLabel l2 = new JLabel("This inturn increases the arrays size.");
        jPanel1.removeAll();
        jPanel1.add(l1);
        jPanel1.add(l2);
        jPanel1.revalidate();
        jPanel1.repaint();
    }

Puede encontrar información adicional en este tema:

Java Swing revalidate () vs repaint ()

1
Community 23 may. 2017 a las 11:44