在 GridBagLayout 中正确定位 JButton | Java 8

Position a JButton properly within a 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);
        
    }
}

这是一张图片,我大概想要“开始”按钮。

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

使用Swing组件。不要扩展 Swing 组件或任何其他 Java class,除非您打算覆盖 class.

中的方法之一

我用 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,3);
   gbc.gridy = 0;
   getWrapperPanel().add(getBtnStart02(), gbc);
    
   //margin 3 at all sides for all following gui objects
   gbc.insets = new Insets(3,3,3,3);
   gbc.gridy = 1;
   getWrapperPanel().add(getBtnLoad(), gbc);

很有魅力。