java - 如何使用 GridLayout 或 GridBagLayout 垂直填充 JPanel?

标签 java layout-manager grid-layout gridbaglayout

我想填充一个布局为GridLayoutJPanel,如果不能使用GridLayout我会想知道是否可以使用 GridBagLayout 以及如何使用?

代码如下:

public class NestedLayoutExample {

public static void main(String[] args) {

    Runnable r = new Runnable() {

        @Override
        public void run() {
            final JFrame frame = new JFrame("Nested Layout Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setMinimumSize(new Dimension(300, 400));

            final JPanel gui = new JPanel(new BorderLayout(5,5));
            gui.setBorder( new TitledBorder("BorderLayout(5,5)") );

            JPanel dynamicLabels = new JPanel(new BorderLayout(4,4));
            dynamicLabels.setBorder( new TitledBorder("BorderLayout(4,4)") );
            gui.add(dynamicLabels, BorderLayout.CENTER);

            final JPanel labels = new JPanel(new GridLayout(4,0,3,3));
            labels.setBorder( new TitledBorder("GridLayout(0,2,3,3)") );

            JButton addNew = new JButton("Add Another Label");
            dynamicLabels.add( addNew, BorderLayout.NORTH );
            addNew.addActionListener( new ActionListener(){
                private int labelCount = 0;

                @Override
                public void actionPerformed(ActionEvent ae) {
                    labels.add( new JLabel("Label " + ++labelCount) );
                    frame.validate();
                }
            } );

            dynamicLabels.add( new JScrollPane(labels), BorderLayout.CENTER );

            frame.setContentPane(gui);
            frame.pack();
            frame.setLocationRelativeTo(null);
            try {
                // 1.6+
                frame.setLocationByPlatform(true);
                frame.setMinimumSize(frame.getSize());
            } catch(Throwable ignoreAndContinue) {}

            frame.setVisible(true);
        }
    };
    SwingUtilities.invokeLater(r);
}}

这就是我得到的上面的代码:

enter image description here

这就是我想要的:

enter image description here

也想知道更好的方法。

最佳答案

这是朝着您寻找的方向迈出的“微小”一步......

GridBagLayout

如果您希望它的工作方式更像 GridLayout(以便第一系列标 checkout 现在顶部/左侧),您将不得不包含一些“填充”对象组成初始网格...

import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;

public class NestedLayoutExample {

    public static void main(String[] args) {

        Runnable r = new Runnable() {

            @Override
            public void run() {
                final JFrame frame = new JFrame("Nested Layout Example");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setMinimumSize(new Dimension(300, 400));

                final JPanel gui = new JPanel(new BorderLayout(5, 5));
                gui.setBorder(new TitledBorder("BorderLayout(5,5)"));

                JPanel dynamicLabels = new JPanel(new BorderLayout(4, 4));
                dynamicLabels.setBorder(new TitledBorder("BorderLayout(4,4)"));
                gui.add(dynamicLabels, BorderLayout.CENTER);

                final JPanel labels = new JPanel(new GridBagLayout());
                labels.setBorder(new TitledBorder("GridLayout(0,2,3,3)"));

                JButton addNew = new JButton("Add Another Label");
                dynamicLabels.add(addNew, BorderLayout.NORTH);
                addNew.addActionListener(new ActionListener() {

                    private int labelCount = 0;
                    private int gridx = 0;
                    private int gridy = 0;

                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        GridBagConstraints gbc = new GridBagConstraints();
                        gbc.weightx = 1;
                        gbc.weighty = 1;
                        gbc.gridx = gridx;
                        gbc.gridy = gridy;
                        labels.add(new JLabel("Label " + ++labelCount), gbc);
                        labels.revalidate();

                        gridy++;
                        if (gridy >= 4) {
                            gridy = 0;
                            gridx++;
                        }
                    }
                });

                dynamicLabels.add(new JScrollPane(labels), BorderLayout.CENTER);

                frame.setContentPane(gui);
                frame.pack();
                frame.setLocationRelativeTo(null);
                try {
                    // 1.6+
                    frame.setLocationByPlatform(true);
                    frame.setMinimumSize(frame.getSize());
                } catch (Throwable ignoreAndContinue) {
                }

                frame.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

关于java - 如何使用 GridLayout 或 GridBagLayout 垂直填充 JPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24666679/

相关文章:

java - RecyclerView 中的选定项目在滚动时发生变化

java - 方法可以返回一个布局吗

java - 为此 jframe 选择最佳布局

java - GridLayout 未在 JFrame 中显示

java - 使用GridLayout时如何在JPanel底部添加ScrollBar?

jquery - 在没有间隙/行的列中排列 div block

java - 使用 gradle 而不是 eclipse 构建

java - JPA findBy 字段忽略大小写

java - 训练 Tesseract - 加载训练语言失败

java - 如何在 JFrame 中排列组件