来自某个 class 的对象能否输出具有唯一 JLabel 的相同格式的 JPanel?

Can objects from a certain class output identically formatted JPanels with unique JLabels?

我有一个 PanelCreator class,它有一个构造函数,它输入两个字符串并将它们转换为 JLabel。它还有一个方法,returns 一个带有这些标签的面板。

private JLabel string1, string2;
private JPanel panel;

PanelCreator(String input1, String input2)
{
    panel = new JPanel();
    string1 = new JLabel();
    string1.setText(input1);

    string2 = new JLabel();
    string2.setText(input2);

    panel.add(string1);
    panel.add(string2);
}

JPanel createPanel()
{
    return panel;
}

我面临的问题是 main 方法将只显示从 createPanel() 创建的最新面板。就好像 panel2 覆盖了 panel1 当我真的需要它们在框架中彼此相邻出现时。

    JFrame f = new MultiplePanelTest();

    PanelCreator panelCreator1 = new PanelCreator("Test1-1", "Test1-2");
    JPanel pane1 = panelCreator1.createPanel();
    f.add(pane1);

    PanelCreator panelCreator2 = new PanelCreator("Test2-1", "Test2-2");
    JPanel pane2 = panelCreator2.createPanel();
    f.add(pane2);

我知道 swing GUI 中的组件只能使用一次,所以我假设问题出在引用相同 JLabel 的 PanelCreator 对象上。我认为将其设为 class 然后从中拉出对象会使每个对象都有自己独特的 JLabel,但我似乎错了。

有没有办法解决这个问题,让 2 个相同的面板各有自己的 JLabel?扩展目标是通过 PanelCreator 对象本身操作标签的文本,而不更改任何格式(因为这两个面板将保存自己的数据,但在 GUI 框架中看起来格式相同)。

每个面板都已正确创建,但它们都直接添加到默认情况下具有 BorderLayoutJFrame 框架。所以它们都被添加到框架的中心,相互重叠。

这基本上等同于:

f.add(pane1, BorderLayout.CENTER);
f.add(pane2, BorderLayout.CENTER);

...这显然是错误的!

因此,如果您想要并排显示面板,请尝试:

f.add(pane1, BorderLayout.WEST);
f.add(pane2, BorderLayout.EAST);

或一个在另一个之上:

f.add(pane1, BorderLayout.NORTH);
f.add(pane2, BorderLayout.SOUTH);

如评论中所述,如果您对 BorderLayout 不满意,还可以修改框架的布局管理器。例如:

f.setLayout(new FlowLayout());
f.add(pane1);
f.add(pane2);

您也可以将面板嵌入到一个父面板中,然后将其添加到 JFrame

    JPanel superPanel = new JPanel();

    PanelCreator panelCreator1 = new PanelCreator("Test1-1", "Test1-2");
    JPanel pane1 = panelCreator1.createPanel();
    superPanel.add(pane1);

    PanelCreator panelCreator2 = new PanelCreator("Test2-1", "Test2-2");
    JPanel pane2 = panelCreator2.createPanel();
    superPanel.add(pane2);

    f.add(superPanel);