当前位置: 首页 > 面试题库 >

SpringLayout问题/挑战

魏威
2023-03-14
问题内容

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

减少到最低限度,我希望在JFrame上并排放置4个JButton:

*=====================*
| +--+ +--+ +--+ +--+ |
| |b1| |b2| |b3| |b4| |
| +--+ +--+ +--+ +--+ |
*=====================*

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

我希望最外面的一个(b1和b4)与容器的边界之间保持恒定的水平距离,即5 px,并且与按钮的南北之间的边界都保持5 px,它们的高度均相同。

我希望按钮之间的间隙也为5像素。

到目前为止,非常容易。我还有更多限制:

当框架变宽(用户/鼠标)时,我希望按钮(b1 / b2,b2 / b3,b3 / b4)之间的间隙变宽,而不是按钮。

如果将框架缩小,我想在其他东西不得不让步之前,将按钮之间的间隙缩小到1或0。

我希望pack()框架上的能够给我一个窗口,使按钮的大小恰到好处,默认的间隙为5px,边框周围为5px。

我编写了以下相当简单的代码,结果令人震惊。间隙不会缩小,并且膨胀只会发生在最右边的按钮(b4)上。

既然我有了自定义按钮,可以自行调整大小,那么使用GridBagLayout可以很轻松地满足这些要求,而使用MigLayout可以更轻松地满足这些要求。那不是我要的答案。具体来说,我的问题是:

使用SpringLayout可以使此布局正常工作吗?怎么样?

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

非常感谢。

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是一个非常巧妙的实现。请忽略其设计错误,这仅是出于演示目的。

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小时了,反响势不可挡。单独的响应(感谢Camickr!)甚至没有尝试触摸SpringLayout。我认为这不是在SO社区而是在SpringLayout的实用程序上反映不佳!

我的印象是SpringLayout是布局管理器的红发继子,在某些方面很有用,但很少使用,因此没有人有使用经验,也没有人愿意向Sun报告错误。

对我来说,事实证明GroupLayout可以完成我所需的一切,并允许我以合理的编码量准确地完成我想要的事情。从GridBagLayout发生的可喜变化是,从一开始我就很清楚我需要采取的步骤以实现预期的布局,而我只需要坐下来编写代码。

对于任何关心的人,这些都是GroupLayout的特征,这些特征对我来说是如此有用:

  • 在水平和垂直方向上或多或少地进行布局。大量的灵活性和更简单的代码;
  • 可以嵌套网格而无需引入仅用于容纳布局的容器。
  • 可以插入具有指定约束的间隙;
  • 可以按共享的尺寸规格形成任意组的组件,即所有组件的尺寸都与该组中最大的组件相同;和
  • 无需子类化即可更改组件的大小(例如,maximumSize = preferredSize)。

问题答案:

您可以使用BoxLayout:

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);
    }
}


 类似资料:
  • 介绍 (Introduction) SpringLayout类根据一组约束定位其关联容器的子SpringLayout 。 Class 声明 (Class Declaration) 以下是javax.swing.SpringLayout类的声明 - public class SpringLayout extends Object implements LayoutManager2

  • 主要内容:1 Java SpringLayout的介绍,2 Java SpringLayout的内部类,3 Java SpringLayout的字段,4 Java SpringLayout的方法,5 Java SpringLayout的案例1 Java SpringLayout的介绍 SpringLayout 中 安排根据一组约束的其相关联的容器的孩子。Constraints都不过是双组分边缘之间的水平和垂直距离。每个约束都由一个SpringLayout.Constraint对象表示。 Spri

  • 我正在使用react datepicker,但出于某种原因,它会在容器后面显示日历。 我曾经尝试过: 但它不起作用。 这是日期选择器组件 有什么建议吗?

  • 我在freecodecamp.org https://www.freecodecamp.org/learn/javascript-algorithors-and-data-structures/mediatory-algorith-scripting/arguments-optional 下面的代码就是我写的。在该代码中,addTogether(2)(3)应为5。但相反,addTogether(2

  • 我有一个SpringLayout需要转换。 基本上,当您创建SpringLayout时,它会按列填充面板,因此如果您有 结果是一个如下所示的表: 然而,我想要 有人知道怎么做吗?

  • 本文向大家介绍问题:你用的模型,最有挑战性的项目相关面试题,主要包含被问及问题:你用的模型,最有挑战性的项目时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 在回答自己的模型时,必须要深入了解自己的模型细节以及其中用到知识(如:Bi-LSTM的优点以及与rnn和lstm的对比)的原理。