JLayeredPane ermöglicht es, mehrere Komponenten übereinander zu stapeln JLayeredPane.add(Component, Integer). Komponenten in höheren "Schichten" werden über Komponenten in unteren "Schichten" angezeigt.JLayeredPane versus Container Schichtung
Container.add(Component, int) bietet einen ähnlichen Mechanismus, wobei Komponenten mit unteren Indizes auf Komponenten mit höheren Indizes angezeigt werden.
Bitte beachten Sie, dass der erste Mechanismus Integer und der zweite Mechanismus verwendet verwendet int. Auch macht man hohe Werte über niedrige, und das andere macht das Gegenteil. Mischen Sie nicht die beiden :)
Meine Frage ist: Was ist der Sinn der Verwendung von JLayeredPane, wenn Container bereits den gleichen Mechanismus bietet? Ist eine Schicht besser als die andere?
UPDATE: Es gibt auch Container.setComponentZOrder(Component, int) zu berücksichtigen.
Re "nie repaint() auf ein Kind von JLayeredPane aufrufen": Ich bin gespannt auf welche Art von Kind-Komponente, die Sie mit diesem gefunden haben. Ich stieß auf [ein ähnliches Problem] (http://stackoverflow.com/questions/5668721/jmenuitems-painting-over-higher-components-in-jlayeredpane) und festgestellt, dass, zumindest in meinem Fall, war es ein Problem mit JMenuItems speziell. Sie verhalten sich so, als wären sie immer oben (es sei denn, sie sind transparent). –
@Aaron, ich erinnere mich nicht, welche Komponente ich verwendet habe, aber wenn Sie darüber nachdenken, macht es Sinn, dass alle Komponenten verhalten werden, sie sind immer oben. paint() soll annehmen, dass Sie die Clip-Grenzen so einstellen, dass sie nicht außerhalb der gewünschten Grenzen zeichnen. Wenn Sie repaint() direkt auf eine untergeordnete Komponente (ohne Grenzen) aufrufen, fordern Sie im Wesentlichen, dass es die Eltern ignoriert. Mit anderen Worten, dies ist kein Fehler in der Swing-Implementierung. Es ist Benutzerfehler. – Gili
Eigentlich stimmt das nicht. Siehe [Malen in AWT und Swing] (http://java.sun.com/products/jfc/tsc/articles/painting/), speziell die Paint Processing-Sektion.Wenn Repaint() 'für eine JComponent aufgerufen wird, verwendet der RepaintManager das Clip-Rechteck und die Eigenschaften 'opaque' und 'isOptimizedDrawingEnabled' der Komponente, um die 'root'-Komponente zu bestimmen, von der aus die Paint-Operation beginnen soll. Die meisten Komponenten verhalten sich nicht so, als ob sie immer oben wären (d. H. 'AlwaysOnTop()' gibt standardmäßig 'false' zurück). –