Warum liefert add(panel, Integer) von Container ein anderes Ergebnis als add(panel, int)?Java

Java-Forum
Anonymous
 Warum liefert add(panel, Integer) von Container ein anderes Ergebnis als add(panel, int)?

Post by Anonymous »

Um den Hintergrund und die Erklärung der Frage bereitzustellen:
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);
Um den Code zu korrigieren, musste ich nicht den primitiven int verwenden, den ich zuvor hatte, sondern Ganzzahlen (die, wie sich herausstellte, JLayeredPane.DEFAULT_LAYER usw. sind).

Code: Select all

layeredPane.add(panel1, Integer.valueOf(0));
...
Ich war neugierig, warum es dieses Verhalten zeigte, also habe ich ein wenig recherchiert. Es stellt sich heraus, dass javax.swing.JLayeredPane ein Nachkomme von java.awt.Container ist (das selbst von java.lang.Object abgeleitet ist). Container (Oracle JavaDoc, ClassPath-Quellcode) hat überladene Add-Methoden (eingeschränkt auf die von mir verwendeten Methoden):

Code: Select all

public Component add(Component comp, int index) {
addImpl(comp, null, index);
return comp;
}
und

Code: Select all

public void add(Component comp, Object constraints) {
addImpl(comp, constraints, -1);
}
Mein Verständnis des Problems beginnt hier etwas unklar zu werden. Ich weiß, dass beide die Methode addImpl aufgerufen haben, wobei die int-Version eine Null-Einschränkung mit dem angegebenen Index übergab, während die Integer-Version die Integer-Methode als Einschränkung und -1 als Index übergab. Im JavaDoc für addImpl heißt es (zur Prägnanz teilweise zusammenfassend):

...
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, int index) (primitives int-Argument) verwendet wird:
Image

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post