setSize, не влияющий на размер кнопки

У меня есть пример кода:

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

public class AWT extends JFrame {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(600, 450));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBackground(Color.green.darker());

        Button btn_1 = new Button("Button 1");
        btn_1.setBackground(Color.green.darker());
        btn_1.setSize(40, 100);
        Button btn_2 = new Button("Button 2");
        btn_2.setBackground(Color.green.darker());
        btn_2.setSize(40, 100);
        Button btn_3 = new Button("Button 3");
        btn_3.setBackground(Color.green.darker());
        btn_3.setSize(40, 100);

        JPanel players = new JPanel(new GridLayout(1, 3));
        players.add(btn_1);
        players.add(btn_2);
        players.add(btn_3);
        players.setBackground(Color.green.darker());
        players.setPreferredSize(new Dimension(450, 80));

        JPanel game = new JPanel();
        game.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        game.setBackground(Color.green);
        game.setPreferredSize(new Dimension(600, 370));

        JPanel content = new JPanel();
        content.setLayout(new BorderLayout());
        frame.setContentPane(content);
        content.add(players, BorderLayout.NORTH);
        content.add(game, BorderLayout.SOUTH);
        frame.pack();
 frame.setVisible(true);
    }
}

Это в результате дает мне такое окно:

сопроводительный текст http://img710.imageshack.us/img710/1573/21672037.gif

, в то время как это должно привести к чему-то больше как это:

сопроводительный текст http://img686.imageshack.us/img686/8948/44650673.gif

Почему это не представляет таким образом?

5
задан DevAno1 19 June 2010 в 16:40
поделиться

2 ответа

GridLayout игнорирует предпочтительный размер кнопок. Замените

JPanel players = new JPanel(new GridLayout(1, 3));

на

JPanel players = new JPanel(); // default FlowLayout

Дополнение: вот связанный пример, позволяющий макету и предпочтительным размерам по умолчанию выполнять свою работу. Если указать как можно меньше ограничений, внешний вид адаптируется к внешнему виду каждой платформы при вызове pack () .

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

public class AWT extends JFrame {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel players = new JPanel();
        players.add(new GameButton("Button 1"));
        players.add(new GameButton("Button 2"));
        players.add(new GameButton("Button 3"));
        players.setBackground(GameButton.color);

        JPanel game = new JPanel();
        game.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        game.setBackground(Color.green);
        game.setPreferredSize(new Dimension(600, 450));

        JPanel content = new JPanel();
        content.setLayout(new BorderLayout());
        frame.setContentPane(content);
        content.add(players, BorderLayout.NORTH);
        content.add(game, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    private static class GameButton extends JButton {

        private static final Color color = Color.green.darker();
        private static final Font font = new Font("SanSerif", Font.BOLD, 20);
        private String name;

        public GameButton(String name) {
            super(name);
            this.setBackground(color);
            this.setFont(font);
        }
    }
}
6
ответ дан 14 December 2019 в 04:30
поделиться
  1. GridLayout растягивает непосредственно добавленные к ним компоненты. Я бы использовал другой макет, или, если вы действительно хотите GridLayout, проверьте код ниже.

  2. Вы должны использовать setPreferredSize и для кнопок! (см. ниже)

import java.awt.*;

import javax.swing.*;
import javax.swing.border.BevelBorder;

public class AWT extends JFrame {

public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(600, 450));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.green.darker());

Кнопка btn_1 = новая кнопка("Кнопка 1");
btn_1.setBackground(Color.green.darker());
btn_1.setPreferredSize(new Dimension(40, 100)); 

Кнопка btn_2 = новая кнопка("Кнопка 2");
btn_2.setBackground(Color.green.darker());
btn_2.setPreferredSize(new Dimension(40, 100)); 

Кнопка btn_3 = новая кнопка("Кнопка 3");
btn_3.setBackground(Color.green.darker());
btn_3.setPreferredSize(new Dimension(40, 100)); 

GridLayout layout = new GridLayout(1, 3);
JPanel players = new JPanel(layout);
JPanel cell1 = new JPanel();
cell1.add(btn_1);
cell1.setBackground(Color.green.darker());
players.add(cell1);
JPanel cell2 = new JPanel();
cell2.add(btn_2);
cell2.setBackground(Color.green.darker());
players.add(cell2);
JPanel cell3 = new JPanel();
cell3.add(btn_3);
cell3.setBackground(Color.green.darker());
players.add(cell3);
players.setBackground(Color.green.darker());
players.setPreferredSize(new Dimension(450, 80));

JPanel game = new JPanel();
game.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
game.setBackground(Color.green);
game.setPreferredSize(new Dimension(600, 370));

JPanel content = new JPanel();
content.setLayout(new BorderLayout());
frame.setContentPane(content);
content.add(players, BorderLayout.NORTH);
content.add(game, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
}
2
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

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