我已经完成了以下布局管理器课程:
-32.59551
public class MainFrameLayout extends BorderLayout
{
private final JPanel north, center, south;
/**
* Constructor for this layout.
*/
public MainFrameLayout()
{
super();
north = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
center = new JPanel();
center.setLayout(new BoxLayout(center, BoxLayout.Y_AXIS));
south = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
north.setVisible(true);
center.setVisible(true);
south.setVisible(true);
super.addLayoutComponent(north, NORTH);
super.addLayoutComponent(center, CENTER);
super.addLayoutComponent(south, SOUTH);
}
@Override
public void addLayoutComponent(Component comp, Object constraints)
{
if (!(constraints instanceof MainFrameLayoutConstraints))
throw new IllegalArgumentException("Invalid constraints");
switch ((MainFrameLayoutConstraints) constraints)
{
case NORTH:
north.add(comp);
break;
case CENTER:
center.add(comp);
break;
case SOUTH:
south.add(comp);
break;
}
}
}
是一个通用MainFrameLayoutConstraints
类,仅包含enum
,NORTH
和CENTER
个变体。
我尝试在以下应用程序中使用此布局:
SOUTH
为什么,当我运行此应用程序时,我的组件(标签和文本字段)是不可见的,即使调用public class MyApplication extends JFrame
{
private final JFormattedTextField caseNumberBox;
public MyApplication()
{
super("A Title Thingy");
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
NumberFormat caseNumberFormat = NumberFormat.getIntegerInstance();
caseNumberBox = new JFormattedTextField(caseNumberFormat);
caseNumberBox.setColumns(20);
this.setLayout(new MainFrameLayout());
this.add(new JLabel("Major Release Case: "), MainFrameLayoutConstraints.NORTH);
this.add(caseNumberBox, MainFrameLayoutConstraints.NORTH);
this.pack();
this.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
MyApplication app = new MyApplication();
}
}
适当地调整窗口大小以适合这些字段?
答案 0 :(得分:2)
行为的原因是尝试在布局管理器中创建组件。虽然MainFrameLayout
为其创建的组件调用super.addLayoutComponent()
,但这些不已添加到父组件本身。因此,您添加到框架中的组件会计入框架的首选尺寸计算,因为它被委托给BorderLayout
,后者假定内容窗格包含您在MainFrameLayout
中创建的面板构造函数,但它们永远不会被绘制,因为面板实际上并没有被添加到内容窗格中。
自定义布局管理器是您尝试实现的错误工具。只需使用嵌套布局。
答案 1 :(得分:1)
这是评论员所说的..你的自定义布局并不是必需的。您可以直接在MyApplication
课程中添加组件。
public MyApplication() {
...
setLayout(new BorderLayout(2, 1));
...
add(new JLabel("Major Release Case: "), BorderLayout.NORTH);
add(caseNumberBox, BorderLayout.CENTER);
...
}