Java / Swing: попытка заставить BorderLayout хорошо играть с GridBagLayout - PullRequest
4 голосов
/ 18 августа 2010

Мне бы хотелось, чтобы у меня было 3 меню, одно из которых было привязано к левому, другое - к центру, а последнее - к правому. Как это:

--------------------------------------------
-toolbar1---------toolbar2---------toolbar3-
--------------------------------------------
-                                          -
-  rest of the window does something here  -

Проблема в том, что я получаю следующий результат:

--------------------------------------------
---------toolbar1toolbar2toolbar3-----------
--------------------------------------------
-                                          -
-  rest of the window does something here  -

Вот пример кода (компилирует и показывает проблему):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestClass extends JFrame {

    public TestClass() {
        super("test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        final JPanel upper = new JPanel();
        upper.setLayout(new GridBagLayout());
        final GridBagConstraints gbc = new GridBagConstraints();

        final JButton toolbar1 = new JButton("toolbar1");
        final JButton toolbar2 = new JButton("toolbar2");
        final JButton toolbar3 = new JButton("toolbar3");

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.WEST;
        upper.add(toolbar1, gbc);

        gbc.gridx = 1;
        gbc.anchor = GridBagConstraints.CENTER;
        upper.add(toolbar2, gbc);

        gbc.gridx = 2;
        gbc.anchor = GridBagConstraints.EAST;
        upper.add(toolbar3, gbc);

        add(upper, BorderLayout.NORTH);

        final JPanel something = new JPanel();
        something.setBackground(Color.WHITE);
        something.setPreferredSize(new Dimension(600, 600));
        something.repaint();
        add(something, BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        final TestClass test = new TestClass();
    }
}

Как я могу это исправить? Я думал, что установив anchor в GridBagConstraints, я позабочусь об этом, но это не сработало.

Ответы [ 2 ]

1 голос
/ 18 августа 2010

Вы забыли добавить:

gbc.weightx = 1.0;
gbc.weighty = 1.0;

Ваш измененный код должен выглядеть следующим образом:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestClass extends JFrame {

    public TestClass() {
        super("test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        final JPanel upper = new JPanel();
        GridBagLayout gridbag = new GridBagLayout();
        upper.setLayout(gridbag);
        GridBagConstraints gbc = new GridBagConstraints();

        final JButton toolbar1 = new JButton("toolbar1");
        final JButton toolbar2 = new JButton("toolbar2");
        final JButton toolbar3 = new JButton("toolbar3");

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.anchor = GridBagConstraints.WEST;
        upper.add(toolbar1, gbc);


        gbc.gridx = 1;
        gbc.anchor = GridBagConstraints.CENTER;
        upper.add(toolbar2, gbc);


        gbc.gridx = 2;
        gbc.anchor = GridBagConstraints.EAST;
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        upper.add(toolbar3, gbc);


        add(upper, BorderLayout.NORTH);

        final JPanel something = new JPanel();
        something.setBackground(Color.WHITE);
        something.setPreferredSize(new Dimension(600, 600));
        something.repaint();
        add(something, BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        final TestClass test = new TestClass();
    }
}

Это работает.

1 голос
/ 18 августа 2010

Если ваша панель инструментов выглядит как BorderLayout (WEST, CENTER, EAST), почему бы не использовать BorderLayout вместо GridBagLayout?

В любом случае, если вы настаиваете на использовании GridBagLayout, установите ограничение weightx для toolbar2 равным 1. Это говорит менеджеру раскладки, что, если доступно больше места, он должен передать все это toolbar2.

  gbc.weightx = 1;
  upper.add(toolbar2, gbc);
  gbc.weightx = 0;
...