JLayeredPane permite apilar varios componentes uno encima del otro usando JLayeredPane.add(Component, Integer). Los componentes en "capas" superiores se muestran en la parte superior de los Componentes en las "capas" inferiores.JLayeredPane versus Container layering
Container.add(Component, int) proporciona un mecanismo similar por el que los componentes con índices inferiores se muestran en la parte superior de los componentes con índices más altos.
Tenga en cuenta que el primer mecanismo utiliza Entero y el segundo mecanismo utiliza int. Además, uno representa valores altos sobre los bajos, y el otro hace lo contrario. No mezcle los dos :)
Mi pregunta es: ¿de qué sirve usar JLayeredPane cuando el contenedor ya proporciona el mismo mecanismo? ¿Una capa de componentes es mejor que la otra?
ACTUALIZACIÓN: También hay Container.setComponentZOrder(Component, int) a considerar.
Re "nunca invoque repintado() en un hijo de JLayeredPane": Tengo curiosidad acerca de con qué tipo de componente hijo encontró esto. Me encontré con [un problema similar] (http://stackoverflow.com/questions/5668721/jmenuitems-painting-over-higher-components-in-jlayeredpane) y determiné que, en mi caso al menos, era un problema con JMenuItems específicamente. Se comportan como si siempre estuvieran en la parte superior (a menos que sean transparentes). –
@ Aaron, no recuerdo qué componente utilicé, pero cuando lo piensas, tiene sentido que todos los componentes se comporten, siempre están en la parte superior. paint() pretende suponer que establecerá los límites del clip para evitar que dibuje fuera de los límites deseados. Cuando invoca repintar() directamente en un componente secundario (sin límites), básicamente le está pidiendo que ignore a su padre. En otras palabras, esto no es un error en la implementación de Swing. Es un error del usuario. – Gili
En realidad eso no es correcto. Consulte [Pintura en AWT y Swing] (http://java.sun.com/products/jfc/tsc/articles/painting/), específicamente la sección de Procesamiento de pintura.Establece que cuando se llama a 'repaint()' en un JComponent, RepaintManager usa el rectángulo del clip y las propiedades 'opaque' y' isOptimizedDrawingEnabled' del componente para determinar el componente 'raíz' desde el que debe comenzar la operación de pintura. La mayoría de los componentes, de hecho, no se comportan como si siempre estuvieran en la parte superior (es decir, 'alwaysOnTop()' devuelve 'false' de manera predeterminada). –