java - 如何使标签和按钮居中?

标签 java swing awt layout-manager gridbaglayout

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

最佳答案

据我了解,您希望标签和按钮位于框架中央。 为此,不要设置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,布局管理器将自动将标签按钮 block 放置在中间。

Result

完整代码

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 - 如何使标签和按钮居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67300696/

相关文章:

Java 向下舍入包括下一个整数

Java double[][] 问题

java - 如何使用FontMetrics?

java - 在 JSP 中打印 HashMap

java - 忽略java日期比较中的任何空格或换行符

java - 两行代码之间的延迟 - 图形

java - Graphics2D类中的draw方法实现

java - 为什么这个列表有错误?

java - 使用 Eclipse 构建 swing 界面使用什么插件更好?

java - GUI等待键盘 "enter"并继续显示