Подтвердить что ты не робот

Как установить размер кнопки?

Я поместил свои кнопки в JPane с помощью GridLayout. Затем я поместил JPanel в другой JPanel с BoxLayout.Y_AXIS. Я хочу, чтобы кнопки в GridLayout были квадратными. Я использую tmp.setSize(30,30), и он не работает. Я также пытаюсь использовать new GridLayout(X, Y, 4, 4), но я не могу понять, что такое X и Y. Итак, каков правильный способ сделать это?

ДОБАВЛЕНО:

Я все еще не могу решить проблему. Вот код того, что я пытаюсь сделать:

import javax.swing.*;
import java.awt.*;

public class PanelModel {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Colored Trails");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

        JPanel firstPanel = new JPanel();
        firstPanel.setLayout(new GridLayout(4, 4));
        JButton btn;
        for (int i=1; i<=4; i++) {
            for (int j=1; j<=4; j++) {
                btn = new JButton();
                btn.setPreferredSize(new Dimension(100, 100));
                firstPanel.add(btn);
            }
        }

        JPanel secondPanel = new JPanel();
        secondPanel.setLayout(new GridLayout(5, 13));
        for (int i=1; i<=5; i++) {
            for (int j=1; j<=13; j++) {
                btn = new JButton();
                btn.setPreferredSize(new Dimension(40, 40));
                secondPanel.add(btn);
            }
        }

        mainPanel.add(firstPanel);
        mainPanel.add(secondPanel);
        frame.add(mainPanel);

        frame.setSize(400,600);
        frame.setVisible(true);
    }
}

Проблема в том, что Java пытается сделать ширину firstPanel и secondPanel равной! Кроме того, Java пытается заполнить всю высоту окна. Как я могу удалить это поведение?

4b9b3361

Ответ 1

Следующий бит кода делает то, о чем вы просите. Просто убедитесь, что вы назначили достаточно места, чтобы текст на кнопке стал видимым.

JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridLayout(4,4,4,4));

for(int i=0 ; i<16 ; i++){
    JButton btn = new JButton(String.valueOf(i));
    btn.setPreferredSize(new Dimension(40, 40));
    panel.add(btn);
}
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);

X и Y (два первых параметра конструктора GridLayout) определяют количество строк и столбцов в сетке (соответственно). Вы можете оставить одно из них равным 0, если вы хотите, чтобы это значение было неограниченным.

Edit

Я изменил предоставленный код и считаю, что теперь он соответствует желаемому:

JFrame frame = new JFrame("Colored Trails");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

JPanel firstPanel = new JPanel();
firstPanel.setLayout(new GridLayout(4, 4));
firstPanel.setMaximumSize(new Dimension(400, 400));
JButton btn;
for (int i=1; i<=4; i++) {
    for (int j=1; j<=4; j++) {
        btn = new JButton();
        btn.setPreferredSize(new Dimension(100, 100));
        firstPanel.add(btn);
    }
}

JPanel secondPanel = new JPanel();
secondPanel.setLayout(new GridLayout(5, 13));
secondPanel.setMaximumSize(new Dimension(520, 200));
for (int i=1; i<=5; i++) {
    for (int j=1; j<=13; j++) {
        btn = new JButton();
        btn.setPreferredSize(new Dimension(40, 40));
        secondPanel.add(btn);
    }
}

mainPanel.add(firstPanel);
mainPanel.add(secondPanel);
frame.setContentPane(mainPanel);

frame.setSize(520,600);
frame.setMinimumSize(new Dimension(520,600));
frame.setVisible(true);

В принципе, теперь я устанавливаю предпочтительный размер панелей и минимальный размер для фрейма.

Ответ 2

Попробуйте с setPreferredSize вместо setSize.

ОБНОВЛЕНИЕ: GridLayout возьмите все пространство в своем контейнере и BoxLayout швы, чтобы охватить всю ширину в своем контейнере, поэтому я добавил несколько склеенных панелей, которые невидимы и просто занимать место, когда пользователь растягивает окно. Я только что сделал это горизонтально, а не вертикально, но вы можете реализовать это так же, если хотите.

Так как GridLayout сделать все ячейки одного размера, не имеет значения, имеют ли они заданный размер. Вы должны указать размер для своего контейнера, как я уже сделал.

import javax.swing.*;
import java.awt.*;

public class PanelModel {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Colored Trails");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

        JPanel firstPanel = new JPanel(new GridLayout(4, 4));
        firstPanel.setPreferredSize(new Dimension(4*100, 4*100));
        for (int i=1; i<=4; i++) {
            for (int j=1; j<=4; j++) {
                firstPanel.add(new JButton());
            }
        }

        JPanel firstGluePanel = new JPanel(new BorderLayout());
        firstGluePanel.add(firstPanel, BorderLayout.WEST);
        firstGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER);
        firstGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH);

        JPanel secondPanel = new JPanel(new GridLayout(13, 5));
        secondPanel.setPreferredSize(new Dimension(5*40, 13*40));
        for (int i=1; i<=5; i++) {
            for (int j=1; j<=13; j++) {
                secondPanel.add(new JButton());
            }
        }

        JPanel secondGluePanel = new JPanel(new BorderLayout());
        secondGluePanel.add(secondPanel, BorderLayout.WEST);
        secondGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER);
        secondGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH);

        mainPanel.add(firstGluePanel);
        mainPanel.add(secondGluePanel);
        frame.getContentPane().add(mainPanel);

        //frame.setSize(400,600);
        frame.pack();
        frame.setVisible(true);
    }
}

Ответ 3

GridLayout часто не лучший выбор для кнопок, хотя это может быть для вашего приложения. Хорошей ссылкой является руководство по использованию Менеджеров макетов. Если вы посмотрите на пример GridLayout, вы увидите, что кнопки выглядят немного глупыми - слишком большими.

Лучшей идеей может быть использование FlowLayout для ваших кнопок, или если вы точно знаете, что хотите, возможно, GroupLayout. (Sun/Oracle рекомендовать, что компоновка GroupLayout или GridBag лучше, чем GridLayout при ручном кодировании.)