首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpringLayout问题/挑战

SpringLayout问题/挑战
EN

Stack Overflow用户
提问于 2009-12-01 22:41:18
回答 2查看 2.7K关注 0票数 1

据说SpringLayout非常强大。我试图使用SpringLayout实现我认为相当简单的布局,但我失败了。

减少到最低限度后,我希望我的JFrame上有4个JFrame,并排:

代码语言:javascript
复制
*=====================*
| +--+ +--+ +--+ +--+ |
| |b1| |b2| |b3| |b4| |
| +--+ +--+ +--+ +--+ |
*=====================*

我希望所有的4都有相同的大小,无论不同的文本。

我希望最外层的(b1和b4)是一个恒定的水平距离,从容器的边界到5 px,在按钮的北部和南部有一个5 px的边框,它们都是相同的高度。

我希望按钮之间的差距是5px以及。

到目前为止还很简单。我有更多的限制:

  • 当框架变得更宽(用户/鼠标)时,我希望按钮(b1/b2,b2/b3,b3/b4)之间的空隙扩大,而不是按钮。如果框架变小了,我想在其他东西让位之前,按钮之间的空隙缩小到1或0。我希望框架上的
  • 能给我一个合适的窗口,用于默认的5 5px间隙和周围的5 5px边框。

我编写了以下相当简单的代码,结果非常糟糕。差距不会缩小,扩展只发生在最右边的按钮(b4)上。

现在我已经有了自定义按钮来负责统一大小调整,我可以很容易地使用GridBagLayout来满足这些需求,使用MigLayout可能更容易满足这些要求。这不是我要找的答案。具体来说,我的问题是:

这个布局可以使用SpringLayout正确地工作吗?怎么做?

布局甚至忽略了我按钮的getMaximumSize()。我是做错什么了还是SpringLayout被窃听了?

非常感谢。

代码语言:javascript
复制
public class SpringLayoutTest extends JFrame {

public SpringLayoutTest() {
  setLocation(100,100);
  setSize(400, 300);
  Container cp = getContentPane();
  SpringLayout layout = new SpringLayout();
  cp.setLayout(layout);

  SiblingButton b1, b2, b3, b4;
  cp.add(b1 = new SiblingButton("..."));
  cp.add(b2 = new SiblingButton("iii"));
  cp.add(b3 = new SiblingButton("xxx"));
  cp.add(b4 = new SiblingButton("WWW"));

  layout.putConstraint(NORTH, b1, 5, NORTH, cp);
  layout.putConstraint(SOUTH, b1, Spring.minus(Spring.constant(5)), SOUTH, cp);
  layout.putConstraint(NORTH, b2, 5, NORTH, cp);
  layout.putConstraint(SOUTH, b2, Spring.minus(Spring.constant(5)), SOUTH, cp);
  layout.putConstraint(NORTH, b3, 5, NORTH, cp);
  layout.putConstraint(SOUTH, b3, Spring.minus(Spring.constant(5)), SOUTH, cp);
  layout.putConstraint(NORTH, b4, 5, NORTH, cp);
  layout.putConstraint(SOUTH, b4, Spring.minus(Spring.constant(5)), SOUTH, cp);

  layout.putConstraint(WEST, b1, 5, WEST, cp);
  layout.putConstraint(WEST, b2, Spring.constant(1, 5, Integer.MAX_VALUE), EAST, b1);
  layout.putConstraint(WEST, b3, Spring.constant(1, 5, Integer.MAX_VALUE), EAST, b2);
  layout.putConstraint(WEST, b4, Spring.constant(1, 5, Integer.MAX_VALUE), EAST, b3);

  layout.putConstraint(EAST, b4, Spring.minus(Spring.constant(5)), EAST, cp);

  layout.putConstraint(WEST, cp, Spring.minus(Spring.constant(5)), WEST, b1);
}

public static void main(String[] args) {
  (new SpringLayoutTest()).setVisible(true);
}

SiblingButton是一个相当简单的实现。请忽略它的设计错误,这只是为了演示目的。

代码语言:javascript
复制
class SiblingButton extends JButton {

static ArrayList<SiblingButton> siblings = new ArrayList<SiblingButton>();

public SiblingButton(String text) {
  super(text);
  siblings.add(this);
}

public Dimension getMaximumSize() {
  return getPreferredSize();
}

public Dimension getMinimumSize() {
   return getPreferredSize();
}

public Dimension getPreferredSize() {
  Dimension mx = new Dimension(0, 0);
  for (SiblingButton sb : siblings) {
     mx = new Dimension(Math.max(mx.width, sb.originalPreferredSize().width), 
           Math.max(mx.height, sb.originalPreferredSize().height));
  }
  return mx;
}

Dimension originalPreferredSize() {
  return super.getPreferredSize();
}

}

更新/结论

现在已经过去了24小时了,反应压倒性地平淡无奇。唯一的回应(谢谢,卡米克尔!)甚至都不想碰SpringLayout。我认为这不是反映在SO社区上,而是反映在SpringLayout的效用上!

我的印象是,SpringLayout是布局管理人员的红头继子,在某些方面很有用,但利用得太少,以至于没有人有工作经验,也没有人费心向Sun报告bug。

对我来说,结果是GroupLayout做了我所需要的一切,并且允许我用合理的编码量来完成我想要的事情。这是对GridBagLayout的一个可喜的改变,我从一开始就清楚地看到了实现我的预期布局所需采取的步骤,我只需要坐下来编写代码。

对于任何关心它的人来说,GroupLayout的这些特性使它对我非常有用:

对于水平方向和垂直方向,

  • 布局或多或少是分开的。许多灵活性和更简单的代码;
  • 可以嵌套网格,而不需要引入容器来保持布局;
  • 可以使用指定的
  • 插入空白,从而形成具有共享大小规格的任意组组件,即所有组件的尺寸都与组中最大的相同;
  • 可以更改组件的大小大小(例如maximumSize = preferredSize),而不需要对组件进行子类划分。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-02 00:23:47

您可以使用BoxLayout:

代码语言:javascript
复制
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class BoxExample extends JFrame
{
    public BoxExample()
    {
        Box box = Box.createHorizontalBox();
        box.setBorder( new EmptyBorder(5, 5, 5, 5) );
        Dimension size = new Dimension(100, 25);

        box.add( createButton("Button1", size) );
        box.add( createStrut() );
        box.add( createButton("Button2", size) );
        box.add( createStrut() );
        box.add( createButton("Button3", size) );
        box.add( createStrut() );
        box.add( createButton("Button4", size) );

        add( box );
    }

    private JButton createButton(String text, Dimension size)
    {
        JButton button = new JButton(text);
        button.setPreferredSize( size );
        button.setMinimumSize( size );
        button.setMaximumSize( size );
        return button;
    }

    private Component createStrut()
    {
        JComponent component = (JComponent)Box.createHorizontalStrut(5);
        component.setMinimumSize(new Dimension(0, 0));
        component.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
        return component;
    }

    public static void main(String[] args)
    {
        BoxExample frame = new BoxExample();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2010-04-01 15:37:52

您需要设置容器的约束(框架的内容窗格),更准确地说,设置容器的东部和南部的约束。请阅读有关以下内容的教程:

http://java.sun.com/docs/books/tutorial/uiswing/layout/spring.html

SpringDemo3解释了这一切

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1829460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档