java setSize 不影响按钮的大小

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3076314/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 00:15:18  来源:igfitidea点击:

setSize not influencing size of button

javaswingsizeawt

提问by DevAno1

I have a sample code :

我有一个示例代码:

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

This as a result gives me such a window :

结果这给了我这样一个窗口:

alt text http://img710.imageshack.us/img710/1573/21672037.gif

替代文字 http://img710.imageshack.us/img710/1573/21672037.gif

, while it should result in something more like this :

,而它应该导致更像这样的东西:

alt text http://img686.imageshack.us/img686/8948/44650673.gif

替代文字 http://img686.imageshack.us/img686/8948/44650673.gif

Why it is not rendering in this way ?

为什么不以这种方式呈现?

回答by trashgod

GridLayoutignores the buttons' preferred size. Replace

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

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

with

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

Addendum: Here's a related example of letting the layout and default preferred sizes do the work. By specifying as few constraints as possible, the appearance adjusts to each platform's look & feel when pack()is invoked.

附录:这是让布局和默认首选尺寸完成工作的相关示例。通过指定尽可能少的约束,外观会在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);
        }
    }
}

回答by Balint Pato

  1. GridLayout stretches out the compoments added to them directly. I'd use another layout, or if you really want GridLayout checkout the code below.

  2. You have to use setPreferredSize on the buttons as well! (see below)

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

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