来自某个类的对象是否可以输出具有唯一JLabel的相同格式的JPanel?

时间:2015-06-24 19:10:17

标签: java swing user-interface jpanel jlabel

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

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中的组件只能使用一次,所以我假设问题是PanelCreator对象引用相同的JLabel。我认为将它作为一个类然后从中拉出对象会使每个对象都有自己独特的JLabel,但我似乎错了。

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

2 个答案:

答案 0 :(得分:3)

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

这基本上相当于:

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);

答案 1 :(得分:2)

您还可以将面板嵌入到一个父面板中,然后将其添加到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);