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

Я поместил свои кнопки в 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 пытается для заполнения всей высоты окна. Как я могу удалить это поведение?

27
задан Roman 29 March 2010 в 12:16
поделиться

3 ответа

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

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, если хотите, чтобы это значение было неограниченным.

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

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

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);

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

33
ответ дан 28 November 2019 в 05:21
поделиться

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

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

2
ответ дан 28 November 2019 в 05:21
поделиться

Попробуйте использовать 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);
    }
}
5
ответ дан 28 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: