Swing组件在自定义布局管理器中不可见

时间:2015-07-29 14:04:31

标签: java swing awt layout-manager border-layout

我已经完成了以下布局管理器课程:

-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类,仅包含enumNORTHCENTER个变体。

我尝试在以下应用程序中使用此布局:

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(); } } 适当地调整窗口大小以适合这些字段?

2 个答案:

答案 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);            
    ...
}