来自某个 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 框架中看起来格式相同)。
每个面板都已正确创建,但它们都直接添加到默认情况下具有 BorderLayout
的 JFrame
框架。所以它们都被添加到框架的中心,相互重叠。
这基本上等同于:
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);
我有一个 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 框架中看起来格式相同)。
每个面板都已正确创建,但它们都直接添加到默认情况下具有 BorderLayout
的 JFrame
框架。所以它们都被添加到框架的中心,相互重叠。
这基本上等同于:
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);