gridwidth и gridheight не работают - PullRequest
       16

gridwidth и gridheight не работают

0 голосов
/ 27 апреля 2018

я играю с GridBagLayout в Java, я написал следующий код, но он не работает, как я ожидал
Я ожидал, что первая кнопка будет помещена в точку (0,0), которая находится в верхнем левом углу кадра.
во-вторых, я ожидал, что высота и ширина второй кнопки будут в два раза больше, чем высота и ширина первой кнопки, но это не так.
вот вывод: https://ibb.co/hDZPgx
вот код:

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

public class GUIJframe extends JFrame {

    private JButton jb1 = new JButton("first");
    private JButton jb2 = new JButton("second");
    private JButton jb3 = new JButton("third");
    private GridBagConstraints gbc = new GridBagConstraints();
    private GridBagLayout gbl = new GridBagLayout();

    public GUIJframe () {
        jcb.addItem(names);
        setLocation(150,150);
        setSize(500,500);
        setLayout(gbl);
        addComponent(jb1,0,0,1,1);
        addComponent(jb2,1,0,2,2);
        addComponent(jb3,2,2,5,5);
        setVisible(true);
    }

    public void addComponent (Component component, int gridx,int gridy, int width, int height) {
        gbc.gridx = gridx;
        gbc.gridy = gridy;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbl.setConstraints(component,gbc);
        add (component);
    }
}

1 Ответ

0 голосов
/ 28 апреля 2018

Я ожидал, что высота и ширина второй кнопки будут в два раза больше, чем высота и ширина первой кнопки

Ваши ожидания неверны.

Ячейки GridBagLayout являются гибкими. Ширина одного столбца не зависит от ширины других столбцов. Это зависит только от ширины дочерних компонентов в нем (а также от вставок и ipadx, если они установлены).

Если компонент занимает два столбца, но в этих столбцах больше ничего нет, у GridBagLayout нет оснований расширять столбцы больше, чем необходимо для размещения предпочтительной ширины этого компонента.

То же самое верно для высот и строк GridBagLayout.

Чтобы один компонент был в два раза больше другого, вам потребуется другой макет. SpringLayout может это сделать, хотя его нелегко использовать. Возможно, вам будет проще просто добавить ComponentListener на «меньший» компонент и использовать новый размер этого компонента в качестве основы для предпочтительного размера «большего» компонента .

Для достижения желаемого результата я бы использовал SpringLayout.

SpringLayout позволяет создавать ограничения, называемые Spring s, которые представляют диапазоны размеров для ребер, ширины и высоты компонентов. Они могут зависеть от диапазонов размеров других компонентов или краев контейнера.

SpringLayout layout = new SpringLayout();
setLayout(layout);

SpringLayout.Constraints jb1Constraints =
    new SpringLayout.Constraints(jb1);

SpringLayout.Constraints jb2Constraints =
    new SpringLayout.Constraints(
        Spring.sum(jb1Constraints.getX(), jb1Constraints.getWidth()),
        jb1Constraints.getY(),
        Spring.scale(jb1Constraints.getWidth(), 2),
        Spring.scale(jb1Constraints.getHeight(), 2));

SpringLayout.Constraints jb3Constraints =
    new SpringLayout.Constraints(
        Spring.sum(jb2Constraints.getX(),
                   Spring.scale(jb2Constraints.getWidth(), 0.5f)),
        Spring.sum(jb2Constraints.getY(), jb2Constraints.getHeight()),
        Spring.scale(jb1Constraints.getWidth(), 5),
        Spring.scale(jb1Constraints.getHeight(), 5));

add(jb1, jb1Constraints);
add(jb2, jb2Constraints);
add(jb3, jb3Constraints);

// Make container big enough to hold all components.

layout.putConstraint(
    SpringLayout.EAST, getContentPane(), 0,
    SpringLayout.EAST, jb3);

layout.putConstraint(
    SpringLayout.SOUTH, getContentPane(), 0,
    SpringLayout.SOUTH, jb3);

Ограничения для jb1 самые простые: соблюдайте минимальный размер этого компонента, предпочтительный размер и максимальный размер. Расположение (0, 0).

Ограничения для jb2 зависят от ограничений jb1:

  • Пружина для координаты x в jb2 равна jb1.x + jb1.width, которая фактически является правым краем jb1.
  • jb2 имеет тот же y, что и jb1 (который фактически равен нулю).
  • Ширина и высота соответствуют jb1, масштабируется на 2.

Ограничения для jb3 зависят как от jb2, так и от jb1:

  • Координата x равна jb2.x + (jb2.width ÷ 2), то есть горизонтальная центральная точка jb2.
  • Координата y равна jb2.y + jb2.height, которая фактически является нижним краем jb2.
  • Ширина и высота соответствуют jb1, масштабируется на 5.

Наконец, SpringLayout отличается от других менеджеров компоновки тем, что он не устанавливает автоматически размер контейнера, который он планирует, чтобы он был достаточно большим для размещения всех дочерних компонентов. Мы должны сделать это самостоятельно, используя SpringLayout.putConstraint , чтобы связать правый край контейнера (EAST) с правым краем jb3, а нижний край контейнера (SOUTH) - с нижним краем jb3.

...