Agregar componentes dinámicamente a un JDialog

Resuelto NeilMonday asked hace 13 años • 3 respuestas

Tengo problemas para agregar JComponents a JDialog cuando el usuario hace clic en un botón en JDialog. Básicamente quiero que se vea así:

Cuando se abre el diálogo

Luego, cuando el usuario haga clic en "Agregar nuevo campo", quiero que se vea así:

Después de que el usuario haga clic en "Agregar nuevo campo"

Parece que no puedo abrir el cuadro de diálogo para agregar el nuevo JLabel o JTextField. ¿Alguien puede indicarme la dirección correcta?

EDITAR : Esta es la acción para el botón "Agregar nuevo campo" (solo estoy probando una etiqueta ahora).

@Action
public void addNewField()
{
    Container contentPane = getContentPane();
    JLabel label = new JLabel ("welkom");
    contentPane.add(label, BorderLayout.CENTER);
}

SOLUCIÓN :

Utilicé la solución de mre y la hice funcionar. Aquí está mi función final:

@Action
public void addNewField()
{
    System.out.println("New Field...");
    Container contentPane = getContentPane();
    JLabel label = new JLabel ("welcome");
    label.setBounds(10,10,100,10); //some random value that I know is in my dialog
    contentPane.add(label);

    contentPane.validate();
    contentPane.repaint();
    this.pack();
}

Otro de mis problemas es que estoy usando un diseño de "Diseño libre" en NetBeans, lo que significa que mi etiqueta probablemente estaba en alguna posición extraña en lugar de estar dentro de los límites de mi diálogo (sólo una suposición). Resolví este problema label.setBounds()para que mostrara exactamente dónde quería que estuviera.

NeilMonday avatar Aug 09 '11 03:08 NeilMonday
Aceptado

Al agregar/eliminar componentes dinámicamente de un contenedor, es necesario invocar revalidate()/ validate()y repaint()luego. El primero obligará al contenedor a diseñar sus componentes nuevamente y el segundo eliminará cualquier "artefacto" visual.

mre avatar Aug 08 '2011 20:08 mre

para evitar más discusiones sobre cualquiera de los métodos requeridos/no requeridos...

Aviso: para agregar/eliminar JComponents(estructura simple solo en una fila/columna y con la misma Size on Screen) es suficiente solo una acción JFrame.pack(),

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

pero para la GUI más completa establecida por algunos estándares Swing LayoutManagersse requiere el uso de

revalidate();
repaint(); // required in most of cases 

ejemplo para una columna

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class AddComponentsAtRuntime {

    private JFrame f;
    private JPanel panel;
    private JCheckBox checkValidate, checkReValidate, checkRepaint, checkPack;

    public AddComponentsAtRuntime() {
        JButton b = new JButton();
        b.setBackground(Color.red);
        b.setBorder(new LineBorder(Color.black, 2));
        b.setPreferredSize(new Dimension(600, 10));
        panel = new JPanel(new GridLayout(0, 1));
        panel.add(b);
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(panel, "Center");
        f.add(getCheckBoxPanel(), "South");
        f.setLocation(200, 200);
        f.pack();
        f.setVisible(true);
    }

    private JPanel getCheckBoxPanel() {
        checkValidate = new JCheckBox("validate");
        checkValidate.setSelected(false);
        checkReValidate = new JCheckBox("revalidate");
        checkReValidate.setSelected(false);
        checkRepaint = new JCheckBox("repaint");
        checkRepaint.setSelected(false);
        checkPack = new JCheckBox("pack");
        checkPack.setSelected(false);
        JButton addComp = new JButton("Add New One");
        addComp.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton b = new JButton();
                b.setBackground(Color.red);
                b.setBorder(new LineBorder(Color.black, 2));
                b.setPreferredSize(new Dimension(600, 10));
                panel.add(b);
                makeChange();
                System.out.println(" Components Count after Adds :" + panel.getComponentCount());
            }
        });
        JButton removeComp = new JButton("Remove One");
        removeComp.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                int count = panel.getComponentCount();
                if (count > 0) {
                    panel.remove(0);
                }
                makeChange();
                System.out.println(" Components Count after Removes :" + panel.getComponentCount());
            }
        });
        JPanel panel2 = new JPanel();
        panel2.add(checkValidate);
        panel2.add(checkReValidate);
        panel2.add(checkRepaint);
        panel2.add(checkPack);
        panel2.add(addComp);
        panel2.add(removeComp);
        return panel2;
    }

    private void makeChange() {
        if (checkValidate.isSelected()) {
            panel.validate();
        }
        if (checkReValidate.isSelected()) {
            panel.revalidate();
        }
        if (checkRepaint.isSelected()) {
            panel.repaint();
        }
        if (checkPack.isSelected()) {
            f.pack();
        }
    }

    public static void main(String[] args) {
        AddComponentsAtRuntime makingChanges = new AddComponentsAtRuntime();
    }
}
mKorbel avatar Aug 08 '2011 22:08 mKorbel