gpt4 book ai didi

java - BoxLayout 无法将奇数宽度的单个元素居中对齐

转载 作者:行者123 更新时间:2023-11-30 11:19:04 26 4
gpt4 key购买 nike

我正在尝试沿面板中心的垂直轴对齐多个元素,而 BoxLayout 似乎正是我所需要的。但是,当添加的所有元素都具有奇数宽度时,它似乎会做一些奇怪的事情。

这是演示这种古怪行为的 SSCCE:

import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.JFrame;
import javax.swing.Box;
import javax.swing.JComponent;
import javax.swing.BoxLayout;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Component;

public class BoxBug {
public static void main(String[] args){
UIManager.put("swing.boldMetal", Boolean.FALSE);
SwingUtilities.invokeLater(new Runnable(){
public void run(){
gui();
}
});
}

public static void gui(){
JFrame f = new JFrame("Title");
Box b = new Box(BoxLayout.Y_AXIS);

JComponent c = new JComponent(){
public void paint(Graphics g){
g.setColor(new Color(255, 0, 0));
g.fillRect(0, 0, getWidth(), getHeight());
}

// just change the first argument here
// (even numbers work fine, odd ones fail)
private Dimension p = new Dimension(3, 20);
public Dimension getPreferredSize(){return p;}
public Dimension getMinimumSize(){return p;}
public Dimension getMaximumSize(){return p;}
};
c.setAlignmentX(Component.CENTER_ALIGNMENT);

b.add(c);
f.add(b);
f.pack();
f.setVisible(true);
}
}

这是它的样子:

enter image description here

当我将 JComponent 的宽度从 3 更改为 4 时,它工作正常:

enter image description here

然后当我将宽度更改为 5 时它再次失败:

enter image description here

我在 Google 和 StackOverflow 上搜索过这个问题,但没有找到任何相关文档,所以在我看来这像是一个错误。

如果这是一个错误,有人可以找到破解方法来绕过它吗?

最佳答案

However, it seems to do strange things when all the elements added have odd-numbered widths.

比这更奇怪。父容器的大小也会影响布局。

我将 f.pack() 替换为:

f.setSize(150, 100);

而且它不起作用。这基本上就是您描述的场景,因为此方法或 f.pack() 将导致父容器具有均匀宽度并且布局不起作用。

但是,如果您使用:

f.setSize(151, 100);

父容器的宽度不正常,但布局正常。

另一个奇怪的观察。我尝试向 Box 添加多个组件。该问题似乎仅在添加的最后一个组件的宽度为奇数时才会发生。

无论如何,我不知道盒子布局在做什么,但对我来说这确实是个错误。

解决方案是使用不同的布局管理器。您可以使用 GridBagLayout 在不同的行上显示组件。您需要为每个组件设置约束以转到新行。

或者您可以尝试使用 Relative Layout ,它支持居中对齐的垂直布局,您不需要任何约束。对您的代码的唯一更改是:

//Box b = new Box(BoxLayout.Y_AXIS);
JPanel b = new JPanel( new RelativeLayout(RelativeLayout.Y_AXIS) );

关于java - BoxLayout 无法将奇数宽度的单个元素居中对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23439314/

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