resultado - ¿Cómo agrego paneles dinámicamente a otros paneles en tiempo de ejecución en Java?
como mostrar resultado en un jlabel java (6)
Estoy tratando de entrar a Java nuevamente (han pasado algunos años). Nunca hice una codificación GUI en Java. He estado usando Netbeans para comenzar con esto.
Al usar winforms en C # en el trabajo, utilizo un control de usuario para construir partes de mi UI y agregarlas a los formularios de forma dinámica.
He estado tratando de usar JPanels
como JPanels
en C #. JPanel
un formulario BlurbEditor
llamado BlurbEditor
. Esto tiene algunos controles simples en él. Estoy tratando de agregarlo a otro panel en tiempo de ejecución en un evento de botón.
Aquí está el código que pensé que funcionaría:
mainPanel.add(new BlurbEditor());
mainPanel.revalidate();
//I''ve also tried all possible combinations of these too
//mainPanel.repaint();
//mainPanel.validate();
Esto lamentablemente no está funcionando. ¿Qué estoy haciendo mal?
Al igual que con todos los códigos de swing, no olvides llamar a cualquier actualización de GUI dentro del hilo de envío del evento. Consulte esto para saber por qué debe hacer actualizaciones como esta
// Do long running calculations and other stuff outside the event dispatch thread
while (! finished )
calculate();
SwingUtilities.invokeLater(new Runnable(){
public void run() {
// update gui here
}
}
Pruebe mainPanel.invalidate()
y luego, si es necesario, mainPanel.validate()
. También podría valer la pena verificar que estás haciendo esto en el hilo de envío del evento, de lo contrario tus resultados serán irregulares y (generalmente) no deterministas.
mainPanel.add (nuevo BlurbEditor ());
mainPanel.validate ();
mainPanel.repaint ();
Swing/AWT
componentes Swing/AWT
generalmente tienen que tener un diseño antes de agregar cosas; de lo contrario, la UI
no sabrá dónde colocar los subcomponentes.
BFreeman ha sugerido BorderLayout
que es uno de los más fáciles de usar y te permite "pegar" cosas en la parte superior, inferior, izquierda, derecha o centro del elemento principal.
Hay otros como FlowLayout
que es como un área de textarea
: agrega componentes de izquierda a derecha en la parte superior del elemento primario y se envuelve en una nueva fila cuando llega al final.
El GridBagLayout
que siempre ha sido notorio por ser imposible de descifrar, pero te proporciona casi todo el control que necesitarías. Un poco como esas tablas HTML
que solíamos ver con combinaciones extrañas de atributos rowspan, colspan, ancho y alto, que nunca parecían verse como querías.
Estaba lidiando con un problema similar, quería cambiar el panel contenido en un panel sobre el tiempo de ejecución
Después de algunas pruebas, nuevas pruebas y muchos fallos en mi pseudo-algoritmo es este:
parentPanel: contiene el panel que queremos eliminar
childPanel: panel que queremos cambiar
parentPanelLayout: el diseño de parentPanel
editParentLayout (): construye parentPanel con diferentes childPanel y NEW parentPanelLayout cada vez
parentPanel.remove(childPanel);
editParentLayout();
parentPanel.revalidate();
parentPanel.repaint();
Me lo imaginé. Los comentarios debajo de la respuesta aceptada aquí lo explican: JTable dinámicamente agregado que no se muestra
Básicamente acabo de agregar lo siguiente antes de mainPanel.add ()
mainPanel.setLayout(new java.awt.BorderLayout());