如何在框架中居中 JButtons(主菜单)?

Posted

技术标签:

【中文标题】如何在框架中居中 JButtons(主菜单)?【英文标题】:How do I center JButtons (Main menu) in a frame? 【发布时间】:2014-05-24 14:21:35 【问题描述】:
import javax.imageio.ImageIO;
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

@SuppressWarnings("serial")
public class ButtonLocationDemo extends JFrame implements ActionListener
  /// Create variables
  private JButton button;
  private JButton button1;
  private JButton button2;
  private JButton button3;
  private JButton button4;
  // private BufferedImage image;

  public ButtonLocationDemo()
    // button1.setForeground(Color.WHITE);

    // Add buttons
    JPanel p = new JPanel();
    button = new JButton("Doorgaan");
    button1 = new JButton("Opslaan");
    button2 = new JButton("Spelregels");
    button3 = new JButton("Naar hoofdmenu");
    button4 = new JButton("Afsluiten");

    button1.setAlignmentX(Component.CENTER_ALIGNMENT);

    button1.setBackground(Color.black);
    button1.setForeground(Color.white);
    button1.setBorder(null);
    button1.setBounds(250,150,100,50);

    button.setBounds(250,50,100,50);
    button.setBackground(Color.black);
    button.setForeground(Color.white);
    button.setBorder(null);

    button2.setBounds(250,250,100,50);
    button2.setBackground(Color.black);
    button2.setForeground(Color.white);
    button2.setBorder(null);

    button3.setBounds(250,350,150,50);
    button3.setBackground(Color.black);
    button3.setForeground(Color.white);
    button3.setBorder(null);

    button4.setBounds(250,450,100,50);
    button4.setBackground(Color.black);
    button4.setForeground(Color.white);
    button4.setBorder(null);

    // Add buttons
    p.add(button);
    p.add(button1);
    p.add(button2);
    p.add(button3);
    p.add(button4);
    p.setBackground(Color.black);
    p.setLayout(null);

    getContentPane().add(p);
    //setLayout(null);
    setDefaultCloseOperation(3);
    setSize(720,720);
    setVisible(true);

    // Add actionListeners
    button.addActionListener(this);
    button1.addActionListener(this);
    button2.addActionListener(this);
    button3.addActionListener(this);
    button4.addActionListener(this);
  

  public static void main(String[] args) 
    new ButtonLocationDemo();
  

  // Action performer
  @Override
  public void actionPerformed(ActionEvent e) 
    if (e.getSource()==this.button)
      System.out.println("Doorgaan");
    
    if (e.getSource()==this.button1)
      System.out.println("Opslaan");    
    
    if (e.getSource()==this.button2)
      System.out.println("Spelregels");  
    
    if (e.getSource()==this.button3)
      System.out.println("Naar hoofdmenu");  
    
    if (e.getSource()==this.button4)
      System.out.println("Afsluiten");  
      System.exit(0);  
        
  

我尝试使用 :"button1.setAlignmentX(Component.CENTER_ALIGNMENT);"但效果并不好。有什么办法可以自动将我的按钮居中到中间?

外观:http://imgur.com/xuca5X5

【问题讨论】:

【参考方案1】:

使用GridLayout

p.setLayout(new GridLayout(5,1));

并删除所有setBounds() 方法调用。

只需将它交给布局管理器来管理组件的位置。不要使用null 布局。


--编辑--

你也可以试试GridBagLayout

p.setLayout(new GridBagLayout());
GridBagConstraints gc=new GridBagConstraints();

gc.gridx=0;
gc.weightx=0.4;
gc.insets=new Insets(5, 5, 5, 5);
//gc.anchor=GridBagConstants.NORTH;


// Add buttons
gc.gridy=0;
p.add(button,gc);
gc.gridy=1;
p.add(button1,gc);
gc.gridy=2;
p.add(button2,gc);
gc.gridy=3;
p.add(button3,gc);
gc.gridy=4;
p.add(button4,gc);

【讨论】:

+1,不要对布局进行硬编码。您想到的任何数字,都有一个合法的配置会破坏它。布局管理器可以做得很好,我认为我不需要在我制作的任何组件上手动设置边界、位置或对齐方式 我尝试了你的第一种方法,它成功了,但按钮却很大。然后我尝试了你的第二种方法,它就像一个魅力!非常感谢! 太好了,我知道这就是我建议第二个选项的原因。 一个小问题:如果我将字体改大一点,它会自动缩放吗? 阅读这里Setting the Default Font of Swing Program in Java【参考方案2】:

您可以使用面板大小和按钮大小,例如..

button1.setSize(100,50);
button1.setPosition(p.getSize().getWidth()/2 - button1.getSize().getWidth()/2, 150);

【讨论】:

【参考方案3】:

如果你想使用 setBounds 方法进行对齐,那么使用 screenSize 就可以了,就像这里一样

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
    int width=screenSize.width;
    int height=screenSize.height;

并根据屏幕尺寸的宽度和高度来安排 x 和 y 坐标。好的编程应该使用 Braj 所说的布局。

【讨论】:

以上是关于如何在框架中居中 JButtons(主菜单)?的主要内容,如果未能解决你的问题,请参考以下文章

无论其大小如何,如何在 JPanel 中居中一组组件

如何让我的菜单项在引导下拉菜单中居中

如何修复不在wordpress中居中的菜单

如何在粘性框架中居中 tkinter 小部件

如何在 Java 中居中 Graphics.drawString()?

如何在borderlayout北区放置两个Jpanels/Jbuttons?