您可以创建自己的布局管理器来计算所有按钮的最大尺寸(可能来自首选尺寸值)并基本上指定相同尺寸(通过setSize)。当然,你必须提供位置信息以及,但是这给提供垂直&横向布局选项
UPDATE
这是我使用的实施,我拿不出它的信用优势,你可以看到它是由Santhosh Kumar撰写的。我觉得它非常有用,因为它不仅将所有按钮的大小设置为相同,而且还提供了对齐方式。您可以在这里找到原始文章http://www.jroller.com/santhosh/entry/how_do_you_layout_command
/**
* @author Santhosh Kumar - [email protected]
*/
public class ButtonLayout implements LayoutManager, SwingConstants {
protected static Logger logger = Logger.getLogger(ButtonLayout.class);
private int gap;
private int alignment;
public ButtonLayout() {
setAlignment(RIGHT);
setGap(2);
}
public ButtonLayout(int alignment, int gap) {
setGap(gap);
setAlignment(alignment);
}
public ButtonLayout(int gap) {
this(RIGHT, gap);
}
public int getAlignment() {
return alignment;
}
public void setAlignment(int alignment) {
this.alignment = alignment;
}
public int getGap() {
return gap;
}
public void setGap(int gap) {
this.gap = gap;
}
private Dimension[] dimensions(Component children[]) {
int maxWidth = 0;
int maxHeight = 0;
int visibleCount = 0;
Dimension componentPreferredSize;
for (int i = 0, c = children.length; i < c; i++) {
if (children[i].isVisible()) {
componentPreferredSize = children[i].getPreferredSize();
maxWidth = Math.max(maxWidth, componentPreferredSize.width);
maxHeight = Math.max(maxHeight, componentPreferredSize.height);
visibleCount++;
}
}
int usedWidth = 0;
int usedHeight = 0;
switch (alignment) {
case LEFT:
case RIGHT:
usedWidth = maxWidth * visibleCount + gap * (visibleCount - 1);
usedHeight = maxHeight;
break;
case TOP:
case BOTTOM:
usedWidth = maxWidth;
usedHeight = maxHeight * visibleCount + gap * (visibleCount - 1);
break;
}
return new Dimension[]{
new Dimension(maxWidth, maxHeight),
new Dimension(usedWidth, usedHeight),};
}
public void layoutContainer(Container container) {
Insets insets = container.getInsets();
int width = container.getWidth() - (insets.left + insets.right);
int height = container.getHeight() - (insets.top + insets.bottom);
Component[] children = container.getComponents();
Dimension dim[] = dimensions(children);
int maxWidth = dim[0].width;
int maxHeight = dim[0].height;
int usedWidth = dim[1].width;
int usedHeight = dim[1].height;
for (int i = 0, c = children.length; i < c; i++) {
if (children[i].isVisible()) {
switch (alignment) {
case LEFT:
children[i].setBounds(
insets.left + (maxWidth + gap) * i,
insets.top,
maxWidth,
maxHeight);
break;
case TOP:
children[i].setBounds(
insets.left + ((width - maxWidth)/2),
insets.top + (maxHeight + gap) * i,
maxWidth,
maxHeight);
break;
case RIGHT:
children[i].setBounds(
width - insets.right - usedWidth + (maxWidth + gap) * i,
insets.top,
maxWidth,
maxHeight);
break;
case BOTTOM:
children[i].setBounds(
insets.left + (maxWidth + gap) * i,
height - insets.bottom - usedHeight + (maxHeight + gap) * i,
// insets.top,
maxWidth,
maxHeight);
break;
}
}
}
}
public Dimension minimumLayoutSize(Container c) {
return preferredLayoutSize(c);
}
public Dimension preferredLayoutSize(Container container) {
Insets insets = container.getInsets();
Component[] children = container.getComponents();
Dimension dim[] = dimensions(children);
int usedWidth = dim[1].width;
int usedHeight = dim[1].height;
return new Dimension(
insets.left + usedWidth + insets.right,
insets.top + usedHeight + insets.bottom);
}
public void addLayoutComponent(String string, Component comp) {
}
public void removeLayoutComponent(Component c) {
}
}
如果帧大小调整,您会发生什么?这些按钮是否应该在西部面板中调整大小,还是应该保持相同的大小并保持不变:顶部,中部,底部? – 2012-07-18 07:23:37
按钮保持在相同的大小,无论是否rezied。当框架没有时,按钮不需要调整大小。 那就是我需要的。但是,嘿,我喜欢学习,调整大小的部分:) – 2012-07-18 07:26:14