Я работал с базовой программой (ниже), чтобы выяснить, как использовать JLayeredPane. Я создал JLayeredPane и добавил его в JFrame, затем перешел к созданию и добавлению панелей в JLayeredPane. В примере GeeksForGeeks, который я использовал, был красный квадрат внизу, затем перекрывающийся зеленый квадрат и, наконец, перекрывающийся синий квадрат сверху. Он добавил()добавил панели в JLayeredPane, используя константы JLayeredPane.DEFAULT_LAYER, JLayeredPane.PALETTE_LAYER и JLayeredPane.MODAL_LAYER. Однако, поскольку я планировал, возможно, использовать больше контроля над слоями, я не использовал их, а вместо этого использовал номера для слоев. Нижний слой равен 0, причем более высокие числа указывают на более высокие уровни.
Но когда я попробовал запустить код, панели поменялись местами. Красный был сверху, зеленый посередине и синий снизу. Проблема была в том, что у меня был код
Код: Выделить всё
layeredPane.add(panel1, 0);
layeredPane.add(panel2, 1);
layeredPane.add(panel2, 2);
Код: Выделить всё
layeredPane.add(panel1, Integer.valueOf(0));
...
Код: Выделить всё
public Component add(Component comp, int index) {
addImpl(comp, null, index);
return comp;
}
Код: Выделить всё
public void add(Component comp, Object constraints) {
addImpl(comp, constraints, -1);
}
...
Ограничения определяются конкретным используемым менеджером компоновки. BorderLayout ... GridBagLayout ... LayoutManager2 ... если текущий менеджер макетов не реализует LayoutManager2 и ограничения являются строкой, то вызывается LayoutManager... ...
Если компонент не является предком этого контейнера и имеет непустой родительский элемент, он удаляется из своего текущего родительского элемента перед ним добавляется в этот контейнер.
...
@param ограничения объект, выражающий ограничения макета для этого компонента
@param index позиция в списке контейнера, в которую вставляется компонент, где -1 означает добавление в конец
...
Код: Выделить всё
protected void addImpl(Component comp, Object constraints, int index) {Насколько я могу судить, JLayeredPane (ни Integer) не является производным ни от одного из этих макетов (или от String). Таким образом, я подозреваю, что в игру вступает последняя стандартная строка JavaDoc. Помимо этого, я понятия не имею, почему объект числа в качестве ограничений обеспечивает другое поведение, чем нулевые ограничения и нумерованный индекс. При передаче Integer мне кажется (мне), что индекс -1 используется не как индекс компонента, а как флаг маршрутизации внутри addImpl. Но настоящая механика? Я не понимаю.
Как объект Integer помещает его в правильный слой, а не в int? Кажется, не имеет значения порядок добавления компонентов, а только переданные числа. Будем признательны за любую помощь/объяснения.
Код: Выделить всё
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;
}
}

Макетирование при добавлении(Компонент компонента, ограничения объекта) (с используются целочисленные объекты:

Подробнее здесь: https://stackoverflow.com/questions/798 ... han-addpan
Мобильная версия