【问题标题】:How do I center label and button?如何使标签和按钮居中?
【发布时间】:2021-07-21 20:05:57
【问题描述】:

I want my Game to look like this:

但它不会,我不知道为什么......一切都没有在我想要的地方。

有人可以帮我吗?我究竟做错了什么? It looks like this:

颜色变化不是问题。它只是所有东西所在的位置。

package view;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class WelcomeScreen extends JFrame{
    JButton button;
    JLabel label;
    ActionListener action;
    GridBagLayout gb = new GridBagLayout();

    public <button> WelcomeScreen(ActionListener action){
        JPanel panel = new JPanel();
        this.setSize(800,600);

        GridBagConstraints gcon = new GridBagConstraints();
        gcon.weightx = 1;
        gcon.weighty = 1;
        gcon.fill = GridBagConstraints.HORIZONTAL;
        gcon.insets = new Insets(5,5,5,5);

        button = new JButton("Start");
        button.setPreferredSize(new Dimension(200, 50));
        button.setFont(new Font("Arial", Font.PLAIN, 20 ));
        button.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 2));
        button.setHorizontalAlignment(SwingConstants.LEFT);

        label = new JLabel("Game");
        label.setPreferredSize(new Dimension(200, 50));
        label.setFont(new Font("Arial", Font.PLAIN, 60 ));

        this.action = action;
        panel.setBorder(BorderFactory.createEmptyBorder(20, 10, 20, 10));
        panel.setLayout(gb);
        //label
        gcon.gridx = 2;
        gcon.gridy = 0;
        //gcon.gridwidth = 4;
        //gcon.gridheight = 1;
        gb.setConstraints(label,gcon);
        panel.add(label);

        //button
        gcon.gridx = 2;
        gcon.gridy = 1;
        //gcon.gridwidth = 2;
        //gcon.gridheight = 1;
        gb.setConstraints(button,gcon);
        panel.add(button);
        this.add(panel,BorderLayout.CENTER);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Start");
        this.setVisible(true);
        button.addActionListener(action);
    }
}

【问题讨论】:

    标签: java swing awt layout-manager gridbaglayout


    【解决方案1】:

    据我了解,您希望标签和按钮在框架中居中。 为此,请勿设置 weightx 和 weighty,因为它们会告诉布局管理器扩展至可用空间。

    所以删除

        gcon.weightx = 1;
        gcon.weighty = 1;
    

    然后,替换下面的代码

        //label
        gcon.gridx = 2;
        gcon.gridy = 0;
        //gcon.gridwidth = 4;
        //gcon.gridheight = 1;
        gb.setConstraints(label,gcon);
        panel.add(label);
    
    
        //button
        gcon.gridx = 2;
        gcon.gridy = 1;
        //gcon.gridwidth = 2;
        //gcon.gridheight = 1;
        gb.setConstraints(button,gcon);
        panel.add(button);
    

    有了这个

        //label
        gcon.gridx = 0;
        gcon.gridy = 0;
        panel.add(label, gcon);
    
        //button
        gcon.gridx = 0;
        gcon.gridy = 1;
        panel.add(button, gcon);
    

    由于没有行和列的权重大于 0,布局管理器会自动将标签按钮块放在中间。

    完整代码

    package test;
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.ActionListener;
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingConstants;
    
    public class WelcomeScreen extends JFrame{
        JButton button;
        JLabel label;
        ActionListener action;
        GridBagLayout gb = new GridBagLayout();
    
    
    
        public <button> WelcomeScreen(ActionListener action){
            JPanel panel = new JPanel();
            this.setSize(800,600);
    
            GridBagConstraints gcon = new GridBagConstraints();
            gcon.fill = GridBagConstraints.HORIZONTAL;
            gcon.insets = new Insets(5,5,5,5);
    
            button = new JButton("Start");
                button.setPreferredSize(new Dimension(200, 50));
                button.setFont(new Font("Arial", Font.PLAIN, 20 ));
                button.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 2));
                button.setHorizontalAlignment(SwingConstants.CENTER);
    
            label = new JLabel("Game");
                label.setPreferredSize(new Dimension(200, 50));
                label.setFont(new Font("Arial", Font.PLAIN, 60 ));
    
            this.action = action;
            panel.setBorder(BorderFactory.createEmptyBorder(20, 10, 20, 10));
            panel.setLayout(gb);
            //label
            gcon.gridx = 0;
            gcon.gridy = 0;
            panel.add(label, gcon);
    
    
            //button
            gcon.gridx = 0;
            gcon.gridy = 1;
            panel.add(button, gcon);
            this.add(panel,BorderLayout.CENTER);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setTitle("Start");
            this.setVisible(true);
            button.addActionListener(action);
    
    
    
    
    
        }
        
        public static void main(String[] args) {
            new WelcomeScreen(null).setVisible(true);
        }
    }
    

    【讨论】:

    • @Annithsi Humm,这听起来很奇怪,我添加了结果的屏幕截图和完整的代码,以防我忘记复制粘贴某些内容,此外我只是将按钮中的文本居中,因为左对齐是不太好。
    • 非常感谢 :) 不幸的是它不起作用..也许是因为我正在使用 Mac?不管怎样,谢谢你的尝试:)
    • @Annithsi 这不应该依赖于平台,正如 GridBagLayout 文档中所写:除非您为行 (weightx) 和列 (weighty) 中的至少一个组件指定权重,所有组件都聚集在其容器的中心。这是因为当权重为零(默认值)时,GridBagLayout 对象会在其单元格网格和容器边缘之间放置任何额外的空间。 。面板中有一些额外的组件吗?
    【解决方案2】:

    如果您愿意使用库,我可以推荐 MigLayout

    解决方案:

    使用 MigLayout,代码看起来更具可读性,而且通常更容易:

    JPanel contentPane = new JPanel(new MigLayout("", "[grow, center]", "[grow, center]"));
    JPanel panel = new JPanel(new MigLayout("wrap 1", "[grow, fill]", "[]20px[]"));
    
    JLabel label = new JLabel("Game");
    label.setFont(new Font("Arial", Font.PLAIN, 60 ));
    panel.add(label);
    
    
    JButton button = new JButton("Start");
    button.setFont(new Font("Arial", Font.PLAIN, 20 ));
    button.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 2));
    button.setHorizontalAlignment(SwingConstants.LEFT);
    panel.add(button);
    
    contentPane.add(panel);
    setContentPane(contentPane);
    

    解释:

    “面板”仍然是持有组件的 JPanel。内容由布局约束控制:

    1. MigLayout 的第一个参数是布局约束,在这种情况下,它只是在每个添加的组件后自动换行到下一行。
    2. 第二个参数是列约束。在这里,它确保“单元格”(布局管理器像表格一样工作)随着“增长”而扩展,并且该单元格内的组件用“填充”填充整个单元格。
    3. 第三个参数是行约束。在这里,它们只是定义了行之间的间隙。列和行约束中的 '[]' 分别代表列/行。该括号内的任何内容都定义了单元格及其内容的行为方式,括号外的任何内容都用于定义间隙。

    “contentPane”只是使用上述相同的方法确保“面板”在内部居中。然后可以将其添加到更大的组件(如框架)并展开,仍然保持内容居中。

    您应该在 http://www.miglayout.com/whitepaper.html 找到有关布局功能的所有信息

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 2017-08-29
      • 2021-08-22
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      相关资源
      最近更新 更多