将JButton正确放置在GridBagLayout中| Java 8

问题描述

我想在我的GUI的下部中央放置一个JButton“开始”。 遗憾的是,我设置的GridBagConstraints似乎没有任何效果。 我正在使用jdk1.8.0_191Eclipse IDE

编辑:我将代码段切换为“最小可复制示例”。 这是我的代码的片段:

package gui.main;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test{
    
    public static void main(String[] args) {
        
        JFrame frame = new JFrame(); 
        frame.setSize(646,509);
        frame.setResizable(false);
        frame.setTitle("Adventure Time");
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        
            JPanel panel = new JPanel();
            panel.setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            
            gbc.gridx = 1;
            gbc.gridy = 5;
            
                JButton button = new JButton("Start");  
                button.setBackground(Color.black);      
                button.setForeground(Color.white);  
                button.setPreferredSize(new Dimension(110,60));
                button.setMinimumSize(new Dimension(110,60));
                button.setVisible(true);
                
            panel.add(button,gbc);
            panel.setVisible(true);
        
        frame.add(panel);
        frame.setVisible(true);
        
    }
}

这是我大约想要“开始”按钮的图片

enter image description here

解决方法

我创建了一个简单,可运行的GUI示例,在JPanel的下四分之一处带有一个开始按钮。这是示例GUI。

Start button GUI

使用Swing组件。除非打算覆盖该类中的方法之一,否则不要扩展Swing组件或任何其他Java类。

我为BorderLayout使用了JPanel。我使用计算出的空白边框将“开始”按钮从中心向下移动。

在此示例中,我设置了JPanel的大小。我假设您将根据图像的大小来设置游戏面板的大小。

这是代码。

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class StartButtonExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new StartButtonExample());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createMainPanel(),BorderLayout.CENTER);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        Dimension panelSize = new Dimension(400,400);
        panel.setPreferredSize(panelSize);

        JButton button = new JButton("Start");
        Dimension buttonSize = button.getPreferredSize();

        int height = panelSize.height - buttonSize.height;
        int width = panelSize.width - buttonSize.width;
        int top = height * 3 / 4;
        int left = (width - buttonSize.width) / 2;
        int bottom = height / 4;
        int right = left;
        panel.setBorder(BorderFactory.createEmptyBorder(
                top,left,bottom,right));

        panel.add(button,BorderLayout.CENTER);

        return panel;
    }

}
,

根据我的业余观点:

我最终在小型应用程序中使用了不同的insets。 我认为这看起来更干净。

   //margin 400 top,rest 3
   gbc.insets = new Insets(400,3,3);
   gbc.gridy = 0;
   getWrapperPanel().add(getBtnStart02(),gbc);
    
   //margin 3 at all sides for all following gui objects
   gbc.insets = new Insets(3,3);
   gbc.gridy = 1;
   getWrapperPanel().add(getBtnLoad(),gbc);

像魅力一样工作。