Java 如何将标签和按钮居中?

Java 如何将标签和按钮居中?,java,swing,awt,layout-manager,gridbaglayout,Java,Swing,Awt,Layout Manager,Gridbaglayout,但是不会,我也不知道为什么。。一切都不在我想要的地方 有人能帮我吗?我做错了什么? 颜色的变化不是问题。。这正是所有东西所在的地方 package view; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class WelcomeScreen extends JFrame{ JButto

但是不会,我也不知道为什么。。一切都不在我想要的地方

有人能帮我吗?我做错了什么?

颜色的变化不是问题。。这正是所有东西所在的地方

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);
    }
}
包视图;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
公共类WelcomeScreen扩展JFrame{
按钮;
JLabel标签;
行动听者行动;
GridBagLayout gb=新的GridBagLayout();
公众欢迎屏幕(ActionListener操作){
JPanel面板=新的JPanel();
这个。设置大小(800600);
GridBagConstraints gcon=新的GridBagConstraints();
gcon.weightx=1;
gcon.weighty=1;
gcon.fill=GridBagConstraints.HORIZONTAL;
gcon.insets=新的insets(5,5,5,5);
按钮=新按钮(“开始”);
按钮。设置首选尺寸(新尺寸(200,50));
setFont(新字体(“Arial”,Font.PLAIN,20));
setboorder(BorderFactory.createEmptyByOrder(2,10,2,2));
按钮设置水平对齐(SwingConstants.左);
标签=新的JLabel(“游戏”);
标签。设置首选尺寸(新尺寸(200,50));
label.setFont(新字体(“Arial”,Font.PLAIN,60));
这个动作=动作;
panel.setBorder(BorderFactory.createEmptyByOrder(20,10,20,10));
面板布局(gb);
//标签
gcon.gridx=2;
gcon.gridy=0;
//gcon.gridwidth=4;
//gcon.gridheight=1;
gb.设置约束(标签、gcon);
面板。添加(标签);
//钮扣
gcon.gridx=2;
gcon.gridy=1;
//gcon.gridwidth=2;
//gcon.gridheight=1;
gb.设置约束(按钮、gcon);
面板。添加(按钮);
添加(面板、边框布局、中心);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
本文件的标题为“开始”;
此.setVisible(true);
addActionListener(操作);
}
}

据我所知,您希望标签和按钮在框架中居中。 为此,不要设置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);
    }
}
封装测试;
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入java.awt.event.ActionListener;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.SwingConstants;
公共类WelcomeScreen扩展JFrame{
按钮;
JLabel标签;
行动听者行动;
GridBagLayout gb=新的GridBagLayout();
公众欢迎屏幕(ActionListener操作){
JPanel面板=新的JPanel();
这个。设置大小(800600);
GridBagConstraints gcon=新的GridBagConstraints();
gcon.fill=GridBagConstraints.HORIZONTAL;
gcon.insets=新的insets(5,5,5,5);
按钮=新按钮(“开始”);
按钮。设置首选尺寸(新尺寸(200,50));
setFont(新字体(“Arial”,Font.PLAIN,20));
setboorder(BorderFactory.createEmptyByOrder(2,10,2,2));
按钮设置水平对齐(SwingConstants.CENTER);
标签=新的JLabel(“游戏”);
标签。设置首选尺寸(新尺寸(200,50));
label.setFont(新字体(“Arial”,Font.PLAIN,60));
这个动作=动作;
panel.setBorder(BorderFactory.createEmptyByOrder(20,10,20,10));
面板布局(gb);
//标签
gcon.gridx=0;
gcon.gridy=0;
面板。添加(标签,gcon);
//钮扣
gcon.gridx=0;
gcon.gridy=1;
面板。添加(按钮,gcon);
添加(面板、边框布局、中心);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
本文件的标题为“开始”;
此.setVisible(true);
addActionListener(操作);
}
公共静态void main(字符串[]args){
新WelcomeScreen(空)。setVisible(真);
}
}

如果您愿意使用库,我可以推荐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。内容由布局约束控制:

  • 它的MigLayout的第一个参数是布局对符,在这种情况下,它只是自动换行到每个添加组件后的下一行
  • 第二个参数是列约束。在这里,它确保“单元”(布局管理器的工作方式类似于表格)以“增长”展开,并且该单元内的组件以“填充”填充整个单元
  • 第三个参数是行约束。在这里,它们只是定义了行之间的间距。列和行控件中的“[]”分别代表一列/行。括号内的任何内容定义单元格及其内容的行为,括号外的任何内容用于定义间距
  • “contentPane”只是使用上述相同的方法确保“panel”在内部居中。然后可以将其添加到更大的组件(如框架)并展开,但仍保持内容的中心


    你应该可以在

    上找到关于版面功能的所有信息,但不幸的是,这也不起作用:(@Annithsi-Humm,这听起来很奇怪,我添加了一个结果的屏幕截图和完整的代码,以防我忘了复制粘贴某些内容,此外,我只是从左a开始将文本居中放置在按钮中