在布局中重新分配时 JPanel 的存在

Existence of JPanel when reassigned in layout

我写了这个快速示例,看看当 BorderLayout 中的某个区域的值与新内容叠加(或替换?)时会发生什么。

import java.awt.*;
import javax.swing.*;

public class Test {

  public static void main(String[] args) {

    JPanel add1 = new JPanel();
    add1.setBackground(Color.RED);

    JPanel add2 = new JPanel();
    add2.setBackground(Color.DARK_GRAY);

    JPanel pane = new JPanel();
    pane.setLayout(new BorderLayout());
    pane.add(add1, BorderLayout.NORTH);
    pane.add(add2, BorderLayout.NORTH);

    JFrame main = new JFrame();
    main.setContentPane(pane);
    main.setPreferredSize(new Dimension(300,300));
    main.setLocation(200,300);
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main.setResizable(false);
    main.setVisible(true);
    main.pack();
  }
}

我想知道当 BorderLayout.NORTH 被重新分配时 add1 会发生什么?垃圾收集器会处理吗?

我假设不会,因为 class Test 中仍然有对 add1 的引用,但是我不确定它是否仍被视为 JFrame 的一部分。如果我要替换 BorderLayout.NORTH,是否需要将 add1 设置为 null?我想我想问的是布局引用是否被替换,新值是否叠加到该位置,或者旧值是否被完全替换因此不再是 JFrame 的一部分。

根据大多数类似的问题,Java API 包含答案。这里 BorderLayout API 具体说明(突出显示我的):

A border layout lays out a container, arranging and resizing its components to fit in five regions: north, south, east, west, and center. Each region may contain no more than one component, and is identified by a corresponding constant: NORTH, SOUTH, EAST, WEST, and CENTER.

因此,通过向 NORTH 部分添加一个新组件,您 取代了 旧组件,并且它不再是 GUI 的一部分。