【问题标题】:Java - Nesting GridBagLayout Layout ManagersJava - 嵌套 GridBagLayout 布局管理器
【发布时间】:2012-11-06 00:00:08
【问题描述】:

我遇到了 GridBagLayouts 的问题。

我有几个组件如下图所示:

如果“顶部”组件收缩得足够小,我希望“中心”组件能够移动到“右上角”的底部边缘上方。但是,这显然会导致问题,因为它必须位于网格中的不同行才能这样做。

为了解决这个问题 - 我将整个右列定义为自己的容器,并带有自己的布局管理器。我希望这两列能够独立运行,但是我遇到了同样的问题!我看不出这两个布局管理器是如何交互的。谁能解释我的问题是什么?

这是相关代码(在我的类中扩展 Applet):

public void init(){
    addComponents();
}

private void addComponents(){
    setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    Left left = new Left();
    Top top = new Top();
    Center center = new Center();
    TopRight topRight = new TopRight();
    BottomRight bottomRight = new BottomRight();
    Bottom bottom = new Bottom();

    topRight.setPreferredSize(new Dimension(200,200));
    top.setPreferredSize(new Dimension(0,200));
    center.setPreferredSize(new Dimension(0,100));
    container.setPreferredSize(new Dimension(200,200));

    c.fill = GridBagConstraints.BOTH;

    c.gridx = 0; c.gridy = 0;
    c.gridwidth = 1; c.gridheight = 3;
    c.weightx = 0.2; c.weighty = 1.0;
    this.add(left,c);

    c.gridx = 1; c.gridy = 0;
    c.gridwidth = 1; c.gridheight = 1;
    c.weightx = 0.8; c.weighty = 0.8;
    this.add(top,c);

    c.gridx = 1; c.gridy = 1;
    c.gridwidth = 1; c.gridheight = 1;
    c.weightx = 0.8; c.weighty = 0.0;
    this.add(center,c);

    c.gridx = 1; c.gridy = 2;
    c.gridwidth = 1; c.gridheight = 1;
    c.weightx = 0.8; c.weighty = 0.2;
    this.add(bottom,c);

    JPanel container = new JPanel();
    container.setLayout(new GridBagLayout());

    c.gridx = 2; c.gridy = 0;
    c.gridwidth = 1; c.gridheight = 3;
    c.weightx = 0.0; c.weighty = 1.0;
    this.add(container,c);

    GridBagConstraints c2 = new GridBagConstraints();
    c2.fill = GridBagConstraints.BOTH;

    c2.gridx = 0; c2.gridy = 0;
    c2.gridwidth = 1; c2.gridheight = 1;
    c2.weightx = 0.0; c2.weighty = 0.0;
    container.add(topRight,c2);

    c2.gridx = 0; c2.gridy = 1;
    c2.gridwidth = 1; c2.gridheight = 1;
    c2.weightx = 0.0; c2.weighty = 1.0;
    container.add(bottomRight,c2);
}

注意:显示的每个组件(左、上等)都是 JPanel 的扩展 - 每个组件都覆盖了它的 paint(Graphics g) 方法以填充一些颜色。

在此先感谢,对长时间阅读感到抱歉,

乔纳森

【问题讨论】:

  • 澄清当边界交叉时会发生什么 - 右上角的组件将突然改变大小(远低于其首选大小),以便中心组件可以继续向上移动。在中心组件移回超过右上角的首选高度之前,它会保持新大小。

标签: java swing applet layout-manager gridbaglayout


【解决方案1】:

我解决了这个问题。这与我不必要地设置了 Top 组件的首选高度有关 - 当我删除该行时,它就像我想要的那样工作。

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多