Кнопки в GridLayout, без изменения размера - PullRequest
0 голосов
/ 26 мая 2018

У меня проблемы с GridLayout, потому что я понимаю, что это нужно мне только для решения моей проблемы: мне нужно, чтобы эта матричная панель (сделанная в GridLayout) не имела размеров.Как и целый квадрат, который находится, например, посередине и не может быть изменен.Я провел большую исследовательскую работу и не смог найти ответ.

public class  ButtonsMatrix extends JButton {

    private int[][] fModel;
    private  int fX;
    private  int fY;

    public ButtonsMatrix(int x, int y, int[][] model) {

        fX = x;
        fY = y;
        fModel = model;

        addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                fModel[fX][fY] = fModel[fX][fY] == 1 ? 0 : 1;
                updateNameFromModel();
            }
        });
        updateNameFromModel();
    }

    private void updateNameFromModel() {
        setText(String.valueOf(fModel[fX][fY]));
    }

    public static void main(String[] args) {

        int dim=10;
        int matrix[][] = new int[10][10];

        JFrame f = new JFrame("Window containing a matrix");
        JPanel p = new JPanel();
        JPanel extra = new JPanel(new FlowLayout());
        extra.add(p);
        p.setLayout(new GridLayout(dim, dim));

        for (int r = 0; r < dim; r++){
            for (int c = 0; c < dim; c++){
                ButtonsMatrix button= new ButtonsMatrix(r, c, matrix);
                p.add(button);
            }
        }

        f.add(p);
        f.pack();
        f.setVisible(true);
    }
}

1 Ответ

0 голосов
/ 26 мая 2018

Поместите панель с GridLayout в другую панель с GridBagLayout.

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

Редактировать

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

Проблема с кодом заключается в том, что после этого он игнорирует панель extra и добавляет панель p (с расположением кнопок в сетке) непосредственно к JFrame с (по умолчанию) BorderLayout.Это приводит к добавлению панели p к CENTER макета границы, которая растягивает компонент для заполнения доступной ширины и высоты.

Чтобы это исправить, просто измените:

f.add(p);

Кому:

f.add(extra);
...