您好,我正在开发一个Java应用程序,下面是一个名为Gui的自定义类的摘录,它扩展了JFrame:
public Gui(){
super("EVC Scan & Price");
setSize(400,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
// GridLayout layout = new GridLayout(5,1);
BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS);
setLayout(layout);
//add header row
headerRow.setAlignmentX(Component.CENTER_ALIGNMENT);
BorderLayout layoutHeading = new BorderLayout();
headerRow.setLayout(layoutHeading);
if (headerImg != null){
ImageIcon icon = new ImageIcon(headerImg);
picLabel.setIcon(icon);}
headerRow.add(picLabel, BorderLayout.NORTH);
title.setAlignmentX(JLabel.CENTER_ALIGNMENT);
headerRow.add(title, BorderLayout.SOUTH);
add(headerRow);
//add first row
firstRow.setAlignmentX(Component.LEFT_ALIGNMENT);
BoxLayout layoutRow1 = new BoxLayout(firstRow,BoxLayout.Y_AXIS);
firstRow.setLayout(layoutRow1);
firstRow.add(catLabel);
scroll.setSize(390,100);
firstRow.add(scroll);
add(firstRow);
setVisible(true);
}
我已阅读了很多教程和api,但实际上看不出有什么问题,不过行读:add(headerRow);似乎是#Box的触发器; BoxLayout无法共享"错误。 如果我将JFrame的布局更改为flowlayout,应用于firstRow部分的嵌套boxlayout工作正常吗?
有人可以帮忙吗?
答案 0 :(得分:3)
改变这个:
BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS);
到此:
BoxLayout layout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS);
产生错误的代码将JFrame作为BoxLayout使用容器传递给BoxLayout的构造函数,而事实上并非如此。实际上,您将布局添加到JFrame的contentPane而不是JFrame。
顺便说一句,你可能会让你的角度扩展JFrame,迫使你创建和显示JFrame,这通常需要更多的灵活性。事实上,我冒昧地说,我创建的大部分Swing GUI代码和我见过的不扩展了JFrame,事实上你很少想做这个。更常见的是,您的GUI类将面向创建JPanels,然后可以将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。