Размер кнопок внутри GridBagLayout

У меня есть массив 3 * 6 JButtons внутри GridBagLayout. Но поскольку длина текста каждой кнопки может различаться, каждый столбец кнопок имеет немного разную ширину. Как сделать, чтобы они были одинаковой ширины?

Вот код:

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 6; j++)
    {
        buttonConstraints.fill = GridBagConstraints.BOTH;
        buttonConstraints.weightx = 1;
        buttonConstraints.weighty = 1;
        buttonConstraints.gridx = j;
        buttonConstraints.gridy = i;
        buttonPanel.add(buttons[i * 6 + j], buttonConstraints);
    }
}

Заранее спасибо.


person tianz    schedule 25.04.2013    source источник


Ответы (3)


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

  • простое решение - использовать GridLayout

  • GridBagLayout для создания столбцов. Размер каждого столбца рассчитывается из PrefferedSize из каждого JButtons в 1-й строке, эти координаты используются для остальных строк в текущем контейнере.

РЕДАКТИРОВАТЬ

введите здесь описание изображения

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GridFromGridBagLayout {

    private JFrame frame = new JFrame();
    private JPanel panel = new JPanel();

    public GridFromGridBagLayout() {
        panel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        for (int row = 0; row < 6; row++) {
            for (int col = 0; col < 3; col++) {
                JButton b = new JButton("(" + row + ", " + col + ")");
                b.putClientProperty("column", col);
                b.putClientProperty("row", row);
                b.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JButton btn = (JButton) e.getSource();
                        System.out.println("clicked column "
                                + btn.getClientProperty("column")
                                + ", row " + btn.getClientProperty("row"));
                    }
                });
                gbc.gridx = col;
                gbc.gridy = row;
                gbc.gridwidth = gbc.gridheight = 1;
                gbc.fill = GridBagConstraints.BOTH;
                gbc.anchor = GridBagConstraints.NORTHWEST;
                gbc.weightx = 33;
                gbc.weighty = 20;
                panel.add(b, gbc);
            }
        }
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                GridFromGridBagLayout borderPanels = new GridFromGridBagLayout();
            }
        });
    }
}
person mKorbel    schedule 25.04.2013
comment
да. Я только что понял, что тоже должен использовать GridLayout. Спасибо. - person tianz; 25.04.2013

С помощью GridBagConstraints вы можете установить ширину равной или такой, как вы хотите. перейдите по этой ссылке для помощи:

Ограничения GridBag

person Community    schedule 25.04.2013
comment
Не могли бы вы быть более конкретным? Какой атрибут GridBagConstraints следует установить? Я пробовал и weightx, и gridwidth, но они не работают. Спасибо. - person tianz; 25.04.2013

попробуй это:

buttonConstraints.fill = GridBagConstraints.HORIZONTAL;
person Izanagi    schedule 15.11.2017