gpt4 book ai didi

java - SpringLayout 问题/挑战

转载 作者:行者123 更新时间:2023-12-01 16:09:15 27 4
gpt4 key购买 nike

SpringLayout 号称功能非常强大。我尝试使用 SpringLayout 实现我认为相当简单的布局,但失败得很严重。

减少到最少,我想在我的 JFrame 上并排放置 4 个 JButton:

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

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

我希望最外面的(b1 和 b4)与容器边框的水平距离恒定为 5 px,按钮的南北边框为 5 px,它们的高度都相同。

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

到目前为止,一切都很简单。我还有更多限制:

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

  • 如果框架变小,我希望在其他东西让路之前将按钮之间的间隙缩小到 1 或可能 0。

  • 我期望 pack()在框架上为我提供一个窗口,该窗口的大小正好适合按钮,默认为 5 像素间隙,周围有 5 像素边框。

我编写了以下相当简单的代码,但结果很糟糕。间隙不会缩小,扩展仅发生在最右边的按钮 (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 小时,但 react 却非常平淡。唯一的响应(谢谢,Camickr!)甚至没有尝试接触 SpringLayout。我认为这不仅反射(reflect)了 SO 社区,而且反射(reflect)了 SpringLayout 的实用性!

我的印象是 SpringLayout 是布局管理器的红发继子,在某些方面很有用,但很少使用,以至于没有人有使用它的经验,也没有人费心向 Sun 报告错误。

对我来说,事实证明 GroupLayout 可以完成我需要的一切,并允许我通过合理数量的编码来完成我想要的事情。 GridBagLayout 的一个值得欢迎的变化是,实现预期布局所需的步骤从一开始就很清楚,我只需要坐下来编写代码即可。

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

  • 布局或多或少是在水平和垂直方向上分开完成的。很大的灵 active 和更简单的代码;
  • 可以嵌套网格,而无需引入容器来保存布局;
  • 可以插入具有指定约束的间隙;
  • 可以形成具有共享尺寸规范的任意组件组,即所有组件都具有与组中最大组件相同的尺寸;和
  • 可以更改组件的大小(例如,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);
}
}

关于java - SpringLayout 问题/挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1829460/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com