Pergunta

Aqui está o código:

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

Suponho que tenha uma tabela de botões com 4 linhas e 9 colunas.E a coluna do meio deve ser mais estreita que as outras colunas.tentei Dimension(30, 10) e Dimension(30, 10) ambos não têm efeito na largura da coluna do meio.Por que?

Foi útil?

Solução

Os gerentes de layout são livres para ignorar o tamanho preferido. Especificamente, GridLayout Sempre tornará cada célula na grade exatamente do mesmo tamanho (é um gerente de layout bastante inútil por esse motivo).

Você terá que usar um gerente de layout diferente, como aninhado BoxLayout ou a GroupLayout.

Outras dicas

GridLayout é bastante inflexível porque cada célula tem o mesmo tamanho, normalmente respeitando as maiores configurações de altura e largura de qualquer objeto adicionado à grade.

Se as linhas e/ou colunas precisarem ter tamanhos variados você deve usar GridBagLayout.

setPreferredSize não alterará o tamanho do botão até que a dimensão seja definida usando a dimensão.

Exemplo:-

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

Encontrei esta versão do método, que se encaixa perfeitamente na sua solução:

.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>>)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top