java 面板居中_如何使用标准Java布局管理器更正/居中GridLayout?

本文探讨了在Java Swing中遇到的问题,即如何在使用GridLayout时确保面板居中,而不是填充整个空间。通过示例代码展示了如何利用BoxLayout和组件间距来达到更好的布局效果。
摘要由CSDN通过智能技术生成

以下代码表示问题.由于我有南北面板的高度设置,其余部分使用GridLayout进入中心面板.我认为,因为它不能在它的行之间平等地共享剩余像素,所以它只留下它们.因此,在下面的代码中,我们在南面板上有一条丑陋的白线.

我的问题是:如何确保GridLayout不占用整个空间时至少居中?

通常情况下,我会使用TableLayout并对情况进行排序,但由于我正在编写答案,因此我只想使用标准管理器.事先知道这对我来说非常有用.

例:

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.GridLayout;

import javax.swing.BorderFactory;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;

public class AligningButonsTest

{

public static void main(String[] args)

{

SwingUtilities.invokeLater(new Runnable()

{

@Override

public void run()

{

JFrame f = new JFrame();

f.setSize(800, 600);

double CONSTANT_FACTOR = .1;

int noOfRows = 5;

JPanel centerP = new JPanel(new GridLayout(noOfRows,1));

for(int i = 0; i < noOfRows; i++)

{

BoxPanel bP = new BoxPanel();

centerP.add(bP);

}

JPanel contentPane = new JPanel(new BorderLayout());

f.setContentPane(contentPane);

contentPane.add(centerP, BorderLayout.CENTER);

JPanel southP = new JPanel();

southP.setBackground(Color.RED.darker());//southP.setOpaque(false);

southP.setPreferredSize(new Dimension(1, (int)(CONSTANT_FACTOR* f.getHeight())));

contentPane.add(southP, BorderLayout.SOUTH);

JPanel northP = new JPanel();

northP.setBackground(Color.RED.darker());//northP.setOpaque(false);

northP.setPreferredSize(new Dimension(1, (int)(CONSTANT_FACTOR* f.getHeight())));

contentPane.add(northP, BorderLayout.NORTH);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setVisible(true);

}

});

}

}

class BoxPanel extends JPanel

{

public BoxPanel()

{

setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.RED));

setBackground(Color.DARK_GRAY);

}

}

解决方法:

BoxLayout在使用Box.createVerticalGlue()分配组件之间的空间方面做得非常好.此示例使用Box.createVerticalStrut(),top和bottom.间隔物在How to Use BoxLayout: Using Invisible Components as Filler中描述.

附录:BoxTest2是一种变体,它使用BoxLayout创建固定尺寸的边缘面板和垂直胶水,以更均匀地分布空间. Box.Filler也可用于控制“剩余”垂直空间.

/** @see https://stackoverflow.com/questions/6072956 */

public class BoxTest2 {

private static final int WIDE = 480;

private static final int HIGH = WIDE / 8;

private static final int ROWS = 5;

private static final Box center = new Box(BoxLayout.Y_AXIS);

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

JFrame f = new JFrame();

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

center.setOpaque(true);

center.setBackground(Color.lightGray);

center.add(Box.createVerticalGlue());

center.add(new EdgePanel());

for (int i = 0; i < ROWS; i++) {

center.add(new BoxPanel());

}

center.add(new EdgePanel());

center.add(Box.createVerticalGlue());

f.add(center, BorderLayout.CENTER);

f.pack();

f.setVisible(true);

}

});

}

private static class EdgePanel extends JPanel {

public EdgePanel() {

Dimension d = new Dimension(WIDE, 2 * HIGH / 3);

setPreferredSize(d);

setBackground(Color.red.darker());

}

}

private static class BoxPanel extends JPanel {

public BoxPanel() {

setPreferredSize(new Dimension(WIDE, HIGH));

setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.red));

setBackground(Color.darkGray);

}

}

}

标签:java,user-interface,layout,swing

来源: https://codeday.me/bug/20190723/1516112.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值