将JPanel大小设置为不大于它包含的元素

时间:2015-03-04 20:43:26

标签: java swing user-interface jpanel

我试图让JPanel不高于它包含的单个JLabel中的文本。以下是一些简单的示例代码,仅限于基本问题:

import java.awt.*;
import javax.swing.*;

public class MinimumSpacing {

    private static void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 250);
        JPanel pane0 = new JPanel(new GridLayout(0,1,0,0));
        JPanel pane1 = new JPanel(new GridLayout(0,1,0,0));
        JPanel pane2 = new JPanel(new GridLayout(0,1,0,0));

        pane1.add(new JLabel("This is line #1.", JLabel.CENTER));
        pane2.add(new JLabel("This is line #2.", JLabel.CENTER));
        pane2.add(new JLabel("This is line #3.", JLabel.CENTER));
        pane2.add(new JLabel("This is line #4.", JLabel.CENTER));
        pane2.add(new JLabel("This is line #5.", JLabel.CENTER));

        pane0.add(pane1);
        pane0.add(pane2);
        frame.add(pane0);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(
                "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
            );
        } catch (Exception exc) {
            //
        }
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }  
}

这是我得到的结果:

enter image description here

我想要的是“第1行”位于帧的顶部,其他4行紧随其下。缩小pane1的大小以实现这一目标的最佳方法是什么?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

不要使用GridLayout。 GridLayout将始终将每个组件的大小调整为相同的大小。

也许你应该使用垂直BoxLayout

阅读Layout Managers上Swing教程中的部分,了解更多信息和工作示例。

答案 1 :(得分:0)

如前所述,您应该考虑使用BoxLayout。以下是如何执行此操作:

  private static void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 250);

        JPanel pane0 = new JPanel();
        pane0.setLayout(new BoxLayout(pane0, BoxLayout.Y_AXIS));

        pane0.add(new JLabel("This is line #1.", JLabel.CENTER));
        pane0.add(new JLabel("This is line #2.", JLabel.CENTER));
        pane0.add(new JLabel("This is line #3.", JLabel.CENTER));
        pane0.add(new JLabel("This is line #4.", JLabel.CENTER));
        pane0.add(new JLabel("This is line #5.", JLabel.CENTER));

        frame.add(pane0);

        frame.setVisible(true);
    }