Почему setPreferredSize не меняет размер кнопки? - PullRequest
3 голосов
/ 30 марта 2010

Вот код:

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

public class TestGrid {

    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 panel = new JPanel();
        panel.setLayout(new GridLayout(4, 9));
        panel.setMaximumSize(new Dimension(9*30-20,4*30));

        JButton btn;
        for (int i=1; i<=4; i++) {
            for (int j=1; j<=4; j++) {
                btn = new JButton();
                btn.setPreferredSize(new Dimension(30, 30));
                panel.add(btn);
            }

            btn = new JButton();
            btn.setPreferredSize(new Dimension(30, 10));
            panel.add(btn);

            for (int j=1; j<=4; j++) {
                btn = new JButton();
                btn.setPreferredSize(new Dimension(30, 30));
                panel.add(btn);
            }

        }
        mainPanel.add(panel);
        frame.add(mainPanel);

        frame.setSize(450,950);
        frame.setVisible(true);
    }
}

Полагаю, у меня есть таблица кнопок с 4 строками и 9 столбцами И средний столбец должен быть уже, чем другие столбцы. Я пробовал Dimension(30, 10) и Dimension(30, 10) оба не влияют на ширину среднего столбца Почему?

Ответы [ 4 ]

8 голосов
/ 30 марта 2010

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

Вам придется использовать другой менеджер раскладки, например, вложенный BoxLayout или GroupLayout.

2 голосов
/ 30 марта 2010

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

Если строки и / или столбцы должны иметь различные размеры, вы должны использовать GridBagLayout.

0 голосов
/ 07 января 2014

Я нашел эту версию метода, которая идеально подходит для вашего решения:

.addComponent(<<a jButton instance>>, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, <<put here an integer to set you max width button size>>)
0 голосов
/ 01 мая 2011

setPreferredSize не изменит размер кнопки, пока размер не будет установлен с помощью Dimension.

Пример: - * +1004 *

Dimension dim = new Dimension(20,20), then use setPerferredSize(dim).

...