sirve que para paneles inside create java jframe jpanel paint jlayeredpane

java - que - JLayeredPane no dibuja



paneles java swing (2)

Buen día,

Espero que esta sea una pregunta rápida de matar. Estoy escribiendo una aplicación que usa JPanels y JLayeredPane dentro de un JFrame. En el inicio inicial de mi aplicación, uno de los paneles no aparece hasta que mi mouse se mueve sobre el área donde debería estar el panel. Incluso llamo a los métodos de validación y repintado, pero todavía puedo mostrar ambos paneles juntos. ¿Alguna sugerencia? Gracias.

Aquí está mi clase JFrame (que tiene el método principal)

import java.awt.Dimension; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; public class Application extends JFrame { public Application() { this.setSize(500,500); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); JLayeredPane lp = new JLayeredPane(); lp.setBounds(0,0,500,500); this.setLayeredPane(lp); Mypanel p1 = new Mypanel(); Mypanel2 p2 = new Mypanel2(); this.getLayeredPane().add(p1,0); this.getLayeredPane().add(p2,1); this.validate(); this.repaint(); this.validate(); } public static void main(String[] args) { Application app = new Application(); } }

Esta es una de mis clases de panel

import javax.swing.JButton; import javax.swing.JPanel; public class Mypanel extends JPanel { public JButton button; public Mypanel() { this.setLayout(null); this.setBounds(0, 0, 500, 500); JButton b = new JButton("Hello"); b.setBounds(20,20,300,300); this.add(b); } }

Y finalmente mi última clase de panel

import javax.swing.JButton; import javax.swing.JPanel; public class Mypanel2 extends JPanel { public JButton button; public Mypanel2() { this.setLayout(null); this.setBounds(0, 0, 500, 500); JButton b = new JButton("SUP"); b.setBounds(20,10,200,200); this.add(b); this.repaint(); this.validate(); this.repaint(); } }


Primero, en un programa válido, solo JComponent vuelve a pintar a sí mismo. Si en algún momento encuentra que llamar a c.repaint() desde el código de su controlador soluciona algún problema, ha descuidado los contratos básicos que se encuentran en el núcleo del marco de swing. Y esta nunca es una buena idea Entonces, eliminar todos esos repaint y validate llamadas es un buen comienzo. Lo siguiente importante es entender cómo los componentes oscilantes ligeros van pintando a sus hijos. Hay 2 modos: optimizado y no optimizado. El primero solo es aplicable cuando los hermanos no se superponen en el contenedor. Si lo hacen y la pintura optimizada está activada, obtendrá todo tipo de comportamientos extraños cuando los componentes se vuelvan a pintar (como al pasar el puntero del mouse sobre ellos). Todos los componentes livianos pueden manejar la superposición de niños a través de setComponentZOrder() . JLayeredPane solo presenta el concepto de una capa como un medio para controlar zorder de una manera más flexible. Intenta ser inteligente sobre qué modo elegir para pintar a sus hijos, pero lamentablemente hay sutilezas sobre cómo funciona. por lo que este código haría lo que necesita:

Mypanel p1 = new Mypanel(); Mypanel2 p2 = new Mypanel2(); getLayeredPane().setLayer(p1,0); getLayeredPane().setLayer(p2,1); getLayeredPane().add(p1); getLayeredPane().add(p2);

y esto no:

Mypanel p1 = new Mypanel(); Mypanel2 p2 = new Mypanel2(); getLayeredPane().add(p1); getLayeredPane().add(p2); getLayeredPane().setLayer(p1,0); getLayeredPane().setLayer(p2,1);

el truco es llamar a setLayer antes de agregar niños al contenedor para que JLayeredPane apague la pintura optimizada.

Por cierto, no pude evitar preguntarme por qué JLayeredPane ? Si necesita cambiar programáticamente entre diferentes diseños, tal vez JTabbedPane sea su respuesta de todos modos


JLayeredPane lp = new JLayeredPane(); JPanel d = new JPanel(); d.setVisible(true); d.setBounds(10, 10, 556, 386); lp.add(d, new Integer(0), 0);