下面的代码代表了问题。由于我具有北面板和南面板的高度,因此使用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()
,顶部和底部。
如何使用BoxLayout:使用不可见的组件作为填充器
中介绍了间隔器。
附录:BoxTest2
是一种变体,用于BoxLayout
创建固定大小的边缘面板和垂直胶水,以更均匀地分布空间。Box.Filler
也可以用于控制“剩余”垂直空间。
/** @see http://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);
}
}
}
*label1:combo1 label2:combo2 label3:combo3 label4:text1 label5:text2 label6:text3*
我试图使用创建一个厨房显示系统,并试图找出一种方法,当第一行已经满了时,在第二行添加另一个面板。GUI的宽度将根据用户的喜好而改变。当更宽时,它应该每行显示更多的组件。
在互联网上阅读了一段时间关于的内容后,我觉得我仍然需要澄清。我的问题: 什么是主要用于? 哪个布局管理器使用起来最灵活? 如何使用布局管理器在特定区域定位组件? 我发现使用布局管理器在容器内的某些区域定位组件非常困难。 您建议我使用哪种布局管理器,还是必须混合使用不同的布局管理器?
问题内容: 我有使用小组布局来组织一些标签的面板。调整大小后,我想将此面板保持在屏幕中央。如果我使用流布局将面板放置在另一个面板中,则可以使标签水平居中,而不能垂直居中。哪个布局管理器允许我将面板保持在屏幕中央? 我还尝试了边框布局,并将其放置在中心,但其大小调整为窗口大小。 问题答案: 尝试使用a 并添加带有空对象的面板。 例如:
有没有办法在Java中使用多个布局管理器。现在我正在使用gridLayout来实现一个国际象棋棋盘,但在它下面我想放一些其他的东西,但不是在gridLayout中。可能是流程布局或其他布局。我该怎么做呢?谢谢
我需要在中制作这样的表。 有什么想法如何做到这一点,以获得像下面图片上的布局吗?