Ich habe mit einem Basisprogramm (unten) gearbeitet, um herauszufinden, wie man JLayeredPane verwendet. Ich habe ein JLayeredPane erstellt und es dem JFrame hinzugefügt und bin dann mit dem Erstellen und Hinzufügen der Panels zum JLayeredPane übergegangen. Das GeeksForGeeks-Beispiel, von dem ich ausgegangen bin, hatte ein rotes Quadrat unten, dann ein überlappendes grünes Quadrat und schließlich ein überlappendes blaues Quadrat oben. Die Panels wurden mithilfe der Konstanten JLayeredPane.DEFAULT_LAYER, JLayeredPane.PALETTE_LAYER und JLayeredPane.MODAL_LAYER dem JLayeredPane hinzugefügt(). Da ich jedoch vorhatte, vielleicht mehr Kontrolle über die Ebenen zu haben, habe ich diese nicht verwendet, sondern Zahlen für die Ebenen verwendet. Die unterste Ebene ist 0, wobei höhere Zahlen höhere Ebenen anzeigen.
Aber als ich versuchte, den Code auszuführen, waren die Panels umgekehrt. Das Rot war oben, das Grün in der Mitte und das Blau unten. Das Problem war, dass ich den Code
hatte
Code: Select all
layeredPane.add(panel1, 0);
layeredPane.add(panel2, 1);
layeredPane.add(panel2, 2);
Code: Select all
layeredPane.add(panel1, Integer.valueOf(0));
...
Code: Select all
public Component add(Component comp, int index) {
addImpl(comp, null, index);
return comp;
}
Code: Select all
public void add(Component comp, Object constraints) {
addImpl(comp, constraints, -1);
}
...
Die Einschränkungen werden durch den jeweils verwendeten Layout-Manager definiert. BorderLayout ... GridBagLayout ... LayoutManager2 ... wenn der aktuelle Layout-Manager LayoutManager2 nicht implementiert und Einschränkungen ein String sind, dann wird LayoutManager... aufgerufen ...
Wenn die Komponente kein Vorfahre dieses Containers ist und ein übergeordnetes Element ungleich Null hat, wird sie von ihrem aktuellen übergeordneten Element davor entfernt wird diesem Container hinzugefügt.
...
@param-Einschränkungen ein Objekt, das Layoutbeschränkungen für diese Komponente ausdrückt
@param-Index die Position in der Liste des Containers, an der die Komponente eingefügt werden soll, wobei -1 bedeutet, an das Ende angehängt zu werden
...
Code: Select all
protected void addImpl(Component comp, Object constraints, int index) {Soweit ich das beurteilen kann, leitet sich JLayeredPane (noch Integer) von keinem dieser Layouts (oder von String) ab. Ich vermute daher, dass die letzte Standardzeile des JavaDoc ins Spiel kommt. Darüber hinaus habe ich keine Ahnung, warum das Objekt einer Zahl als Einschränkung ein anderes Verhalten aufweist als Null-Einschränkungen und ein nummerierter Index. Bei der Übergabe von Integer scheint es (für mich) nicht so zu sein, dass der Index -1 als Index der Komponente verwendet wird, sondern als Routing-Flag innerhalb von addImpl. Aber die eigentliche Mechanik? Ich verstehe das nicht.
Wie funktioniert das Integer-Objekt, um es in der richtigen Ebene zu platzieren, anstatt in einem int? Es scheint nicht die Reihenfolge zu sein, in der die Komponenten hinzugefügt werden, sondern nur die übergebenen Zahlen. Für jede Hilfe/Erklärung wäre ich dankbar.
Code: Select all
import javax.swing.*;
import java.awt.*;
public class SandboxGuiOne
{
public static void main(String[] args)
{
// Create JFrame (main window of application)
JFrame frame = new JFrame("JLayeredPane Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
// Create JLayeredPane to manage layering of components
JLayeredPane layeredPane = new JLayeredPane();
frame.add(layeredPane); // add JLayeredPane to JFrame
// Create three colored panels to add to layered pane
JPanel panel1 = createColoredPanel(Color.RED, 100, 100, 200, 200);
JPanel panel2 = createColoredPanel(Color.GREEN, 150, 150, 200, 200);
JPanel panel3 = createColoredPanel(Color.BLUE, 200, 200, 200, 200);
// Add panels to layered pane with different layer values.
// Layers determine stacking order of the panels.
layeredPane.add(panel1, Integer.valueOf(0));
layeredPane.add(panel2, Integer.valueOf(1));
layeredPane.add(panel3, Integer.valueOf(2));
frame.setVisible(true);
}
private static JPanel createColoredPanel(Color color, int x, int y, int width, int height)
{
// Create colored JPanel with specific color and position
JPanel panel = new JPanel();
panel.setBackground(color);
panel.setBounds(x, y, width, height);
return panel;
}
}

Layout, wenn add(Component comp, Object Constraints) (mit Integer-Objekte) wird verwendet:

Mobile version