Почему связанные компоненты не могут быть изменены в GroupLayout?

Для графического интерфейса приложения калькулятора, которое я делаю, у меня есть сетка JButton объекты, где все они имеют одинаковый размер, за исключением того, что один в два раза больше ширины остальных. Это должно выглядеть примерно так (за исключением того, что линии будут прямыми):

Первой моей мыслью было бы определить размер для JButton объекты (давайте назовем это CELL_SIZE), а затем установите предпочтительный размер кнопок на CELL_SIZEкроме более длинной кнопки CELL_SIZE * 2, Это работает, пока вы не измените размер окна. Я хочу, чтобы кнопки сами меняли размеры, чтобы при всех размерах окна все кнопки были одинакового размера, кроме более длинных. Поэтому я попытался с помощью linkSizeсо всеми кнопками, кроме длинной, в качестве аргументов. Но размер кнопок не изменился! Затем я прочитал в Javadoc, что linkSize предотвращает изменение размеров компонентов. Почему это? Могу ли я использовать этот метод для выполнения этого макета, или мне нужно что-то еще?

Ниже приведен класс, который я напечатал, чтобы продемонстрировать проблему (реальное приложение переполнено другими функциями, кроме макета). Оно имеет всего 5 кнопок и служит для представления левой нижней области изображения 3x2.

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

class A extends JPanel{

    public static final int CELL_SIZE = 32;
    JButton b1 = new JButton("1");
    JButton b2 = new JButton("2");
    JButton b3 = new JButton("3");
    JButton b4 = new JButton("4");
    JButton b5 = new JButton("5");

    public A(){
        GroupLayout layout = new GroupLayout(this);
        layout.setHorizontalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup()
                .addComponent(b1, 0, CELL_SIZE, Short.MAX_VALUE)
                .addComponent(b2, 0, CELL_SIZE, Short.MAX_VALUE)
            ).addGroup(layout.createParallelGroup()
                .addGroup(layout.createSequentialGroup()
                    .addComponent(b3, 0, CELL_SIZE, Short.MAX_VALUE)
                    .addComponent(b4, 0, CELL_SIZE, Short.MAX_VALUE)
                )
                .addComponent(b5, 0, CELL_SIZE * 2, Short.MAX_VALUE)
            )
        );
        layout.setVerticalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup()
                .addComponent(b1, 0, CELL_SIZE, Short.MAX_VALUE)
                .addComponent(b3, 0, CELL_SIZE, Short.MAX_VALUE)
                .addComponent(b4, 0, CELL_SIZE, Short.MAX_VALUE)
            ).addGroup(layout.createParallelGroup()
                .addComponent(b2, 0, CELL_SIZE, Short.MAX_VALUE)
                .addComponent(b5, 0, CELL_SIZE, Short.MAX_VALUE)
            )
        );
        layout.linkSize(b1, b2, b3, b4);
        setLayout(layout);
    }

    private static void createAndShowGUI(){
        JFrame f = new JFrame("GroupLayout Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new A());
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                createAndShowGUI();
            }
        });
    }

}

РЕДАКТИРОВАТЬ: если я позвоню addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) и удалите linkSize звоните, тогда размеры кнопок становятся странными. b1 а также b2 стать шире, чем b3 а также b4но не так широко, как b5,

1 ответ

Из учебника Oracle:

1) Чтобы изменить размер компонента (разрешить сжатие и рост):

group.addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ...

Это позволяет компоненту изменять размер от нулевого размера (минимального) до любого размера (Short.MAX_VALUE, поскольку максимальный размер означает "бесконечный"). Если бы мы хотели, чтобы компонент не уменьшался ниже своего минимального размера по умолчанию, мы использовали бы GroupLayout.DEFAULT_SIZE вместо 0 во втором параметре.

2) Чтобы сделать компонент фиксированного размера (подавить изменение размера):

group.addComponent(component, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE,
          GroupLayout.PREFERRED_SIZE) ...

Я думаю, что вы должны использовать 1-й вариант.

Другие вопросы по тегам