GridBagLayout锚点& JScrollPane问题

时间:2016-04-27 10:38:08

标签: java swing jscrollpane layout-manager gridbaglayout

我有以下课程

public class Demo {

private JFrame mainFrame;

static public Color BGCOLOUR1 = new Color(240, 240, 240);

public Demo() {
    mainFrame = new JFrame("Demo");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setLayout(new BorderLayout());
    mainFrame.setSize(900, 800);

    JPanel centralPanel = new JPanel();
    centralPanel.setOpaque(true);
    centralPanel.setBackground(BGCOLOUR1);
    centralPanel.setLayout(new GridBagLayout());
    centralPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20),
            BorderFactory.createTitledBorder("Panel")));

    JPanel insidePanel = new JPanel();
    insidePanel.setOpaque(true);
    insidePanel.setBackground(BGCOLOUR1);
    insidePanel.setLayout(new BorderLayout());
    insidePanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Inside panel"),
            BorderFactory.createEmptyBorder(10, 10, 10, 10)));


    JTextArea insidePanelText = new JTextArea(6, 50);
    insidePanelText.setLineWrap(true);

    insidePanel.add(insidePanelText);

    centralPanel.add(insidePanel, new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.NORTH,
            GridBagConstraints.HORIZONTAL, new Insets(10, 10, 10, 10), 0, 0));

    JScrollPane scrollPane = new JScrollPane(centralPanel);
    mainFrame.add(scrollPane);
}

当我将GridBagConstraints锚点设置为centralPanel时,为什么内部面板位于NORTH(垂直)的中心?我希望它位于顶部。

此外,如果我在centralPanel中添加JScrollPane,然后根据示例将mainFrame添加到pack,我可以将应用程序大小调整得更好,但只要我调整大小它更小(即使它仍然比我最初开始时还大),会出现一个滚动条。我怎样才能防止这种情况发生?

编辑:为了说明滚动问题(当我拍摄这些屏幕时,我wrap_content编辑了框架:

The application when started

当我启动应用程序时,它没有滚动条

The application when made larger and then smaller again

我将窗口调整得更大,然后再缩小。只要我缩小,就会出现滚动条。

1 个答案:

答案 0 :(得分:2)

GridBagLayout而言,根据您提供的属性,它已被布置到单元格的NORTH

GridBagLayout主要用于组件的首选大小,并计算每个组件在父容器中心周围的位置。

如果,而不是:

new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.NORTH,
        GridBagConstraints.HORIZONTAL, new Insets(10, 10, 10, 10), 0, 0)

我用的是:

new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.NORTH,
        GridBagConstraints.HORIZONTAL, new Insets(10, 10, 10, 10), 0, 0)

它会产生预期的结果。

基本上,通过使用gridy并将其设置为1,我们要求GridBagLayout为此单元格提供所有剩余的垂直空间,但因为我们'如果没有填充单元格,内容将被推送到单元格的NORTH

Vertical position

  

另外,如果我在将JSParollPane中的centralPanel添加到mainFrame之前根据示例我可以将应用程序的大小调整得更好,但是一旦我将其调整得更小(即使它仍然比我原来的大开始吧)出现一个滚动条。我该如何防止这种情况发生?

我无法真正复制这个特定的问题,我可以使用packsetSize并将窗口调整为较小的尺寸,以及#34;打包"大小和滚动条会出现,但一旦我调整窗口大小超过"打包"滚动条的大小会消失