La mejor manera de subclasificar un JPanel en Swing
Pregunta
Actualmente estoy tratando de construir un panel desplegable en Swing (similar al control Expander
de WPF) y me gustaría conservar los métodos habituales para manipularlo (es decir, setLayout
, add
, etc.). Solo deben enrutarse a un panel incrustado (el que se muestra u oculta).
¿Cómo haría uno eso? Anular todos los métodos de JComponent
y redirigirlos a un JPanel
incrustado sería engorroso, pero esa es la única forma en que veo.
¿O debería preferir hacer que el panel incrustado sea visible para el exterior y obligar a los usuarios a usar algo como ExpanderPanel.getInnerPanel ()
en su lugar. Pero entonces no es un reemplazo directo para JPanel
que creo que sería bueno tener.
Solución
En 1.5 (ish) Swing encaminó algunos métodos al panel de contenido en JFrame
, JApplet
, etc. Si bien parece haber algunos beneficios de usabilidad para aquellos que recién comienzan , en realidad no soluciona el problema. Por lo tanto, todos tienen que lidiar con una API de comportamiento muy extraño. Entonces, mi consejo es evitar este enfoque.
Otros consejos
Eche un vistazo al JXTaskPane del proyecto Swingx . Ya hace lo que necesitas.
Si tiene un widget de Contenedor que contiene un panel que desea mostrar y ocultar, ¿por qué no diseñar su panel interno como desee, luego agregarlo al panel de Contenedor, luego usar métodos estáticos contra el Contenedor para decir
JPanel p = nuevo JPanel (); // hacer algo con el JPanel ...
ContainerWidget.setContent (p);
ContainerWidget.expandPanel (p, verdadero);
¿Algo le gustaría a este trabajo?