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



下面的代码代表了这个问题。由于我设置了北面板和南面板的高度,其余部分使用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);
    }   
}

如何确保GridLayout不占用整个空间时至少居中?

JPanel wrapper = new JPanel( new GridBagLayout() );
wrapper.add( centerP );
contentPane.add(wrapper, BorderLayout.CENTER);  
//contentPane.add(centerP, BorderLayout.CENTER); 

BoxLayout使用Box.createVerticalGlue()在组件之间分配空间方面做得很好。此示例使用顶部和底部的Box.createVerticalStrut()How to Use BoxLayout:Using Invisible Components as Filler中介绍了垫片。

附录: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);
        }
    }
}

你能试着把这个中心面板嵌套在BorderLayout.North中,甚至FlowLayout.center.中吗

我的意思是:JPanel holder=新JPanel(new BorderLayout());holder.add(centerP,BorderLayout.NORTH);contentPane.add(占位符,BorderLayout.CENTER);

我无法准确地想象你的问题,所以很难写出解决方案。

相关内容

  • 没有找到相关文章

最新更新