Por que setPreferredSize não altera o tamanho do botão?
-
23-09-2019 - |
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?
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>>)