在下面的代码中,当一个JPanel没有添加到JFrame扩展时,程序工作正常但是,我注释掉了JPanel并使用了GridLayout,一切都正确并且很好地放置在JFrame上。对JPanel如何显示对象有什么限制吗?在代码中,我已经注释掉了以下语句:
this.setLayout(new GridLayout(3,2));
this.add(nameLabel);
this.add(name);
this.add(urlLabel);
this.add(url);
this.add(typeLabel);
this.add(type);
并且程序显示错误,但如果上述陈述未被注释且下面的陈述被评论:
//add some panes..
JPanel panel = new JPanel();
panel.add(nameLabel);
panel.add(name);
panel.add(urlLabel);
panel.add(url);
panel.add(typeLabel);
panel.add(type);
this.add(panel);
,那么程序运行正常。以下是完整的代码摘录。
[CODE]
public class FeedInfo extends JFrame {
private JLabel nameLabel = new JLabel("Name:", SwingConstants.RIGHT);
private JTextField name;
private JLabel urlLabel = new JLabel("URL",SwingConstants.RIGHT);
private JTextField url;
private JLabel typeLabel = new JLabel("Type",SwingConstants.RIGHT);
private JTextField type;
public FeedInfo()
{
super("Feed Information");
this.setSize(400,105);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String response1 = JOptionPane.showInputDialog(null,"Enter the site name:");
name = new JTextField(response1,20);
String response2 = JOptionPane.showInputDialog(null,"Enter the site address:");
url = new JTextField(response2, 20);
String[] choices ={"Personal","Commercial","Unkown"};
int response3 = JOptionPane.showOptionDialog(null, "what type of site is it?",
"site Type",0, JOptionPane.QUESTION_MESSAGE, null, choices, choices[0]);
type = new JTextField(choices[response3],20);
//add some panes..
JPanel panel = new JPanel();
panel.add(nameLabel);
panel.add(name);
panel.add(urlLabel);
panel.add(url);
panel.add(typeLabel);
panel.add(type);
this.add(panel);
/*this.setLayout(new GridLayout(3,2));
this.add(nameLabel);
this.add(name);
this.add(urlLabel);
this.add(url);
this.add(typeLabel);
this.add(type);
*/
this.setVisible(true);
}
[/CODE]
答案 0 :(得分:3)
JPanel
不会自行执行布局,它使用LayoutManager
。在您的情况下,您希望覆盖默认FlowLayout
并使用GridLayout
(就像您对JFrame
所做的那样)。所以这样做!
JPanel panel = new JPanel(new GridLayout(3, 2));
...
答案 1 :(得分:2)
JPanel panel = new JPanel();
panel.add(nameLabel);
panel.add(name);
panel.add(urlLabel);
panel.add(url);
panel.add(typeLabel);
panel.add(type);
this.add(panel);
执行此操作时,您将JPanel添加到JFrame,但JFrame的布局未更改,这意味着默认情况下它具有BorderLayout。尝试将最后一行更改为:add(panel, BorderLayout.CENTER);
您可以阅读有关JFrame here
此外,JPanel默认使用FlowLayout,这意味着将在“流畅的线条”中添加对象您应该在JPanel上设置布局以获得所需的结果
答案 2 :(得分:2)
您的程序没有按预期工作,使用第二部分代码,因为您正在使用
JPanel panel = new JPanel();
默认情况下,使用此行,您可以在JPanel API中看到,您正在创建一个布局为FlowLayout
的JPanel。关于空构造函数的JPanel API报告:
JPanel()
Creates a new JPanel with a double buffer and a flow layout.
通常,流布局是JPanel最简单的布局,并且不可能以易于理解的方式加载Swing内容。您正在使用的GridLayout提供了在网格中加载组件的功能,可以显示Java应用程序的GUI。
现在,您知道,因为使用基本FlowLayout的程序不会按预期显示所有的swing组件,就像在第一部分代码中一样,当您使用GridLayout时。 如果要创建带有GridLayout的JPanel,只需键入:
JPanel panel = new JPanel(new GridLayout(3, 2));
答案 3 :(得分:1)
有两个重要的事实要知道。默认情况下,JFrame使用BorderLayout。 JPanel默认使用Flowlayout。这就是为什么您会看到不同的行为,具体取决于您要将其他组件添加到哪个组件。
FlowLayout几乎一文不值,所以在使用JPanel时,你几乎总是想要改变它。 @Mark Peters向您展示了如何做到这一点。 BorderLayout几乎总是完美地用于顶级容器,我很少改变它。我倾向于几乎完全使用BoxLayout作为我的嵌套JPanels。