Элементы в GridBagLayout неправильно выровнены - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь выровнять 3 элемента в GridBagLayout, 2 элемента сверху и 1 элемент снизу. Оба предмета должны быть одинакового размера. Я пытался добиться этого с помощью BorderLayout и GridBagLayout, но безуспешно.

enter image description here

Это моя попытка с GridBagLayout, поскольку вы можете видеть, что они не выровнены должным образом. Это то, что я пытался сделать.

Add first item
Set the x to 1
Add second item
Set the y to 1
Add the last item

Я надеялся, что это сработает, потому что для меня не имеет смысла, почему это не сработает, вот код для него.

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = 0;
    gbc.gridy = 0;
    JTextField oldPkg = new JTextField();
    container.add(oldPkg, gbc);
    gbc.gridx = 1;
    JTextField newPkg = new JTextField();
    gbc.gridy = 1;
    JTextField apkPath = new JTextField();
    container.add(apkPath, gbc);

Результат, которого я хочу достичь, -

enter image description here

Я добился этого с помощью FlowLayout, но он не уходит в пакет при изменении размера кадра, а нижняя полоса немного велика.

Как мне добиться этого с помощью GridBagLayout или любого другого макета, чтобы он оставался неизменным при изменении размера?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Иногда вам нужно отойти назад и попробовать другой подход.Возможно, начиная с листа бумаги, где вы можете нарисовать макет и вычерчивать ограничения.

Это приведет вас к пониманию того, что apkPath должно начинаться с x из 0 и "span"два столбца.

В настоящее время apkPath использует ту же позицию x, что и newPkg, вам нужно изменить ее, прежде чем использовать снова.

gbc.gridy = 1;
gbc.gridx = 0;
JTextField apkPath = new JTextField();
container.add(apkPath, gbc);

Хорошо, но теперьэто тот же размер, что и oldPkg, нам нужно сказать GridBagLayout, что мы хотим охватить несколько столбцов

gbc.gridy = 1;
gbc.gridx = 0;
gbc.gridwidth = 2;
JTextField apkPath = new JTextField();
container.add(apkPath, gbc);

теперь должно позволять текстовому полю обтекать оба столбца

Я мог бы предложитьглядя на Как использовать GridBagLayout для получения более подробной информации

0 голосов
/ 17 ноября 2018

Немного не по теме: Могу я просто предложить не беспокоиться о 90% встроенных макетов и просто использовать MigLayout.

Есть базовая банка MigLayout и банка MigLayout swing.(Не принимайте банку MigLayout SWT по ошибке, а также не используйте версии SWT в операторах импорта).

Я полагаю, что лицензия либеральная.Но вы можете проверить, соответствует ли он вашим потребностям.

http://www.miglayout.com/

(просто счастливый пользователь. Не связан)

Это очень много всего за несколько строк:

public class LayoutAnswer extends JFrame {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                LayoutAnswer window = new LayoutAnswer();

                window.init();
                window.pack();

                window.setVisible(true);
                window.setLocationRelativeTo(null);
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });

    }

    private JPanel panel = new JPanel( new MigLayout("insets 10","[300::, grow][400::, grow]","[100:150:200][100:150:200]") );
    private JLabel lbl1 = new JLabel("One");
    private JLabel lbl2 = new JLabel("Two");
    private JLabel lbl3 = new JLabel("Three");
    public void init() {
        add(panel, BorderLayout.CENTER);

        panel.add(lbl1, "");
        panel.add(lbl2, "wrap");
        panel.add(lbl3, "span 2");
    }
}

Sample image. Resizes nicely.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...