当前位置: 首页 > 面试题库 >

如何使用标准Java布局管理器纠正/居中GridLayout?

姚淳
2023-03-14
问题内容

下面的代码代表了问题。由于我具有北面板和南面板的高度,因此使用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);
        }
    }
}


 类似资料:
  • 我试图使用创建一个厨房显示系统,并试图找出一种方法,当第一行已经满了时,在第二行添加另一个面板。GUI的宽度将根据用户的喜好而改变。当更宽时,它应该每行显示更多的组件。

  • *label1:combo1 label2:combo2 label3:combo3 label4:text1 label5:text2 label6:text3*

  • 在互联网上阅读了一段时间关于的内容后,我觉得我仍然需要澄清。我的问题: 什么是主要用于? 哪个布局管理器使用起来最灵活? 如何使用布局管理器在特定区域定位组件? 我发现使用布局管理器在容器内的某些区域定位组件非常困难。 您建议我使用哪种布局管理器,还是必须混合使用不同的布局管理器?

  • 问题内容: 我有使用小组布局来组织一些标签的面板。调整大小后,我想将此面板保持在屏幕中央。如果我使用流布局将面板放置在另一个面板中,则可以使标签水平居中,而不能垂直居中。哪个布局管理器允许我将面板保持在屏幕中央? 我还尝试了边框布局,并将其放置在中心,但其大小调整为窗口大小。 问题答案: 尝试使用a 并添加带有空对象的面板。 例如:

  • 有没有办法在Java中使用多个布局管理器。现在我正在使用gridLayout来实现一个国际象棋棋盘,但在它下面我想放一些其他的东西,但不是在gridLayout中。可能是流程布局或其他布局。我该怎么做呢?谢谢

  • 我需要在中制作这样的表。 有什么想法如何做到这一点,以获得像下面图片上的布局吗?