Java 设置大小不影响按钮的大小

Java 设置大小不影响按钮的大小,java,swing,size,awt,Java,Swing,Size,Awt,我有一个示例代码: 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 D

我有一个示例代码:

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);
    }
}
因此,这给了我这样一个窗口:

,而它的结果应该更像这样:


为什么不以这种方式渲染?

GridLayout忽略按钮的首选大小。替换

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

附录:下面是一个让布局和默认首选尺寸发挥作用的相关示例。通过指定尽可能少的约束,调用
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);
        }
    }
}
  • GridLayout将直接添加到构件中的构件展开。我会使用另一个布局,或者如果您真的想要GridLayout,请检查下面的代码

  • 您还必须在按钮上使用setPreferredSize!(见下文)


  • 对于布局来说,这也是一个很好的解决方案。虽然setPreferredSize做了魔术中的大小部分。这很有启发性,但我经常尝试避免使用组件属性的手太重。在某些平台上,例如Mac OS X,
    JButton上的
    setBackground()
    没有明显的效果;而
    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.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);
            }
        }
    }
    
    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.setPreferredSize(new Dimension(40, 100)); 
    
    Button btn_2 = new Button("Button 2");
    btn_2.setBackground(Color.green.darker());
    btn_2.setPreferredSize(new Dimension(40, 100)); 
    
    Button btn_3 = new Button("Button 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);
    }
    }