Agregar componentes dinámicamente a un JDialog
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í:
Luego, cuando el usuario haga clic en "Agregar nuevo campo", quiero que se vea así:
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.
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.
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()
,
pero para la GUI más completa establecida por algunos estándares Swing LayoutManagers
se 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();
}
}