如何解决如何将标签和按钮居中?
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);
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",60 ));
this.action = action;
panel.setBorder(BorderFactory.createEmptyBorder(20,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,布局管理器会自动将标签按钮块放在中间。
完整代码
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);
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",60 ));
this.action = action;
panel.setBorder(BorderFactory.createEmptyBorder(20,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);
}
}
,
如果您愿意使用库,我可以推荐 MigLayout。
解决方案:
使用 MigLayout,代码看起来更具可读性,而且通常更容易:
JPanel contentPane = new JPanel(new MigLayout("","[grow,center]",center]"));
JPanel panel = new JPanel(new MigLayout("wrap 1",fill]","[]20px[]"));
JLabel label = new JLabel("Game");
label.setFont(new Font("Arial",60 ));
panel.add(label);
JButton button = new JButton("Start");
button.setFont(new Font("Arial",20 ));
button.setBorder(BorderFactory.createEmptyBorder(2,2));
button.setHorizontalAlignment(SwingConstants.LEFT);
panel.add(button);
contentPane.add(panel);
setContentPane(contentPane);
说明:
“面板”仍然是包含组件的 JPanel。内容由布局约束控制:
- 它的 MigLayout 的第一个参数是布局约束,在这种情况下,它只是在每个添加的组件后自动换行到下一行。
- 第二个参数是列约束。在这里,它确保“单元格”(布局管理器的工作方式类似于表格)以“增长”扩展,并且该单元格内的组件使用“填充”填充整个单元格。
- 第三个参数是行约束。在这里,它们只是定义了行之间的间隙。列和行约束中的“[]”分别代表列/行。括号内的任何内容都定义了单元格及其内容的行为方式,括号外的任何内容都用于定义间隙。
“contentPane”只是使用上述相同的方法确保“面板”在内部居中。然后可以将其添加到更大的组件(如框架)并展开,同时仍保持内容居中。
找到有关布局功能的所有信息版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。