Изменение ограничений компонента в GridBagLayout после их добавления в кадр - PullRequest
0 голосов
/ 02 апреля 2020

Я видел два других сообщения на stackoverflow об этом, и в обоих решениях используется setConstraints(myComponent, anotherConstraint), который даже не подходит как доступный метод, когда я пытаюсь использовать его в java.

хотите динамически изменить вкладку в макете мешка сетки

Динамически изменить вес компонента в GridBagLayout

Как еще можно Я изменяю weightx компонента после нажатия кнопки?

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

enter image description here

1 Ответ

0 голосов
/ 02 апреля 2020

Я не смог заставить setConstraints() работать ..

Тогда, похоже, код был неправильным. Исходя из того, что RHS красной панели аккуратно совпадает с LHS метки Articuno, я подозреваю, что ячейка мешка с сеткой, содержащая красную панель, не охватывает более одного столбца и в настоящее время полностью заполняет этот столбец.

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

enter image description here enter image description here

Вот упрощенный пример, показывающий, как это сделать. Обратите внимание, что необходимо было позвонить revalidate(), чтобы увидеть изменения.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.image.BufferedImage;

public class FullWidthToggle {

    private JComponent ui = null;

    FullWidthToggle() {
        initUI();
    }

    public final void initUI() {
        if (ui != null) {
            return;
        }

        GridBagConstraints gbc = new GridBagConstraints();
        GridBagLayout gbl = new GridBagLayout();
        ui = new JPanel(gbl);
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        BufferedImage image = new BufferedImage(
                160, 20, BufferedImage.TYPE_INT_RGB);
        gbc.insets = new Insets(5, 5, 5, 5);
        ui.add(new JLabel(new ImageIcon(image)), gbc);

        final JCheckBox checkBox = new JCheckBox("Full Width");
        gbc.gridx = 1;
        gbc.anchor = GridBagConstraints.LINE_START;
        ui.add(checkBox, gbc);

        final JLabel label = new JLabel("Am I full width?");
        label.setBorder(new LineBorder(Color.RED, 2));
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 2;
        ui.add(label, gbc);

        ActionListener actionListener = (ActionEvent e) -> {
            if (checkBox.isSelected()) {
                gbc.fill = GridBagConstraints.HORIZONTAL;
            } else {
                gbc.fill = GridBagConstraints.NONE;
            }
            gbl.setConstraints(label, gbc);
            ui.revalidate(); // <- important! 
        };
        checkBox.addActionListener(actionListener);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception useDefault) {
            }
            FullWidthToggle o = new FullWidthToggle();

            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);

            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());

            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}
...