Necesito agregar componentes dinámicamente. Además, necesito modificar el diseño dinámicamente.Java Swing: cómo cambiar la GUI dinámicamente
Respuesta
Como referencia, aquí hay un sscce que muestra el método esencial, validate()
. Este más elaborado example muestra ambos requisitos: cambia el diseño y agrega componentes dinámicamente.
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
/** @see http://stackoverflow.com/questions/5750068 */
public class DynamicLayout extends JPanel {
private static final LayoutManager H = new GridLayout(1, 0);
private static final LayoutManager V = new GridLayout(0, 1);
public DynamicLayout() {
this.setLayout(H);
this.setPreferredSize(new Dimension(320, 240));
for (int i = 0; i < 3; i++) {
this.add(new JLabel("Label " + String.valueOf(i), JLabel.CENTER));
}
}
private void display() {
JFrame f = new JFrame("DynamicLayout");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
JPanel p = new JPanel();
p.add(new JButton(new AbstractAction("Horizontal") {
@Override
public void actionPerformed(ActionEvent e) {
DynamicLayout.this.setLayout(H);
DynamicLayout.this.validate();
}
}));
p.add(new JButton(new AbstractAction("Vertical") {
@Override
public void actionPerformed(ActionEvent e) {
DynamicLayout.this.setLayout(V);
DynamicLayout.this.validate();
}
}));
f.add(p, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new DynamicLayout().display();
}
});
}
}
Ejemplo de cambio de la disposición dinámica:
package swinglayout;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class LayoutChanger implements ActionListener{
JButton b1;
JButton b2;
JButton b3;
JButton b4;
JButton b5;
JButton b6;
/** This button set the flowlayout on panel2 with left orientation */
JButton flowLayout;
/** This button set the Gridlayout of 2,3 grid on panel2 */
JButton gridLayout;
/** This button set the Borderlayout on panel2*/
JButton borderLayout;
/**
* This panel is control panel where we use button to change
* layout of another panel
*/
JPanel panel;
/** This panel contain multiple button from b1 to b6 */
JPanel panel2;
JFrame frame;
public LayoutChanger() {
//set Default Look and Feel on frame
JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container con = frame.getContentPane();
con.setLayout(new BorderLayout());
panel = new JPanel();
panel2 = new JPanel();
//This button are used to only showing the layout effect
b1 = new JButton("HelloButton1");
b2 = new JButton("HelloButton2");
b3 = new JButton("HelloButton3");
b4 = new JButton("HelloButton4");
b5 = new JButton("HelloButton5");
b6 = new JButton("HelloButton6");
// By default panel have layout
panel2.add(b1);
panel2.add(b2);
panel2.add(b3);
panel2.add(b4);
panel2.add(b5);
panel2.add(b6);
// Layout changer button
flowLayout = new JButton("FlowLayout");
gridLayout = new JButton("GridLayout");
borderLayout = new JButton("BorderLayout");
//call Action listener on every layout changer button
flowLayout.addActionListener(this);
gridLayout.addActionListener(this);
borderLayout.addActionListener(this);
panel.add(flowLayout);
panel.add(gridLayout);
panel.add(borderLayout);
// add layout changer button panel at a top
//button panel at the center of container
con.add(panel, BorderLayout.PAGE_START);
con.add(panel2, BorderLayout.CENTER);
frame.setVisible(true);
frame.pack();
}
public void actionPerformed(ActionEvent e) {
//set the flowlayout on panel2
if(e.getSource() == flowLayout) {
FlowLayout flow = new FlowLayout(FlowLayout.LEFT);
panel2.setLayout(flow);
panel2.validate();
}
//set the gridlayout on panel2
if(e.getSource() == gridLayout) {
GridLayout grid = new GridLayout(2,3);
panel2.setLayout(grid);
panel2.validate();
}
//set the gridlayout but the problem if we don't set the constraint
//all button are set on center. So you remove the all button from panel
//Then set grid layout on panel and add them with constraints.
if(e.getSource() == borderLayout) {
panel2.remove(b1);
panel2.remove(b2);
panel2.remove(b3);
panel2.remove(b4);
panel2.remove(b5);
panel2.remove(b6);
BorderLayout border = new BorderLayout();
panel2.setLayout(border);
panel2.add(b1,BorderLayout.NORTH);
panel2.add(b2,BorderLayout.SOUTH);
panel2.add(b3,BorderLayout.EAST);
panel2.add(b4,BorderLayout.WEST);
panel2.add(b5,BorderLayout.CENTER);
panel2.add(b6,BorderLayout.BEFORE_FIRST_LINE);
panel2.validate();
}
}
public static void main(String args[]) {
new LayoutChanger();
}
}
Una cosa es recordar configura nuevo diseño en el panel no se olvidó de llamar al método validate()
en panel.If no se llama a este método no se ve el efecto del cambio en el diseño. Si desea ver el efecto sin llamar al método, debe cambiar el tamaño del marco. También puede establecer mismo diseño muy fácilmente como FlowLayout
, GridLayout
y BoxLayout
, pero cuando se establece BorderLayout
que requiere restricciones para añadir elemento, por lo que primero eliminar todos los componentes del panel remove(Component comp)
método a continuación, añadir el componente en el panel por fuerza
- 1. Java GUI Swing Model Explicación
- 2. Componentes JAVA Swing GUI ¿cómo ver RTL?
- 3. java swing dinámicamente agregar componentes
- 4. ¿Cómo mejorar la apariencia de JAVA swing GUI?
- 5. GUI Arquitectura y diseño en Java (Swing)
- 6. Mejor generador de GUI para Java/Swing
- 7. Cómo cambiar un JLabel dinámicamente
- 8. Java AWT/SWT/Swing: ¿cómo planificar una GUI?
- 9. ¿Recomendado Standalone Swing GUI Builder?
- 10. Swing/AWT - Crear GUI programáticamente
- 11. Java Swing: cambie la configuración regional dinámicamente en el tiempo de ejecución
- 12. ¿Cómo puedo arreglar un programa de la GUI de Java (swing), que funciona con awesome-wm?
- 13. Bibliotecas Java GUI
- 14. GUI de Java Swing en Mac OS X
- 15. hex visualizador/editor componente GUI para Java Swing?
- 16. Aprendiendo Java Swing (¿Constructor de GUI o no?)
- 17. GUI generada dinámicamente
- 18. Swing Threading de Java
- 19. Alternativas GUI de Java
- 20. Java API Adjuntar: cambiar dinámicamente java.library.path
- 21. Git GUI: cómo cambiar la configuración regional
- 22. ¿Escribir gui programáticamente o usando un editor gui avanzado (Java Swing)?
- 23. Automatización de GUI basada en Java (No se limita a GUI como Swing)
- 24. Cómo hacer un buen diseño GUI de Swing de
- 25. Ventana corrediza Java Swing
- 26. Java Swing de JTextField inserción
- 27. ¿Existe un marco para generar dinámicamente una GUI Swing desde un Pojo en Runtime?
- 28. Java Swing FlowLayout Alignments
- 29. Swing Desarrollo de GUI con resorte
- 30. Manejo de excepciones en la GUI de Swing
I ¡Creo que hablo por todos al desearle mucha suerte para hacer esto! Debería ser posible con Swing, pero como con cualquier cosa, el diablo está en los detalles. ¿Has leído los tutoriales en los administradores de diseño? ¿Tienes preguntas o problemas específicos con el código que has probado? ¿Hay algún detalle de su problema actual que nos pueda decir que nos ayude a ayudarlo? Lamentablemente, su pregunta actual, como se le hizo, es demasiado general para dar una respuesta específica. –