微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法在 GridBagLayout 的开头放置具有不同空间的 JButton?

如何解决有没有办法在 GridBagLayout 的开头放置具有不同空间的 JButton?

我正在尝试做这样的事情:

https://i.stack.imgur.com/jjqaD.png

但我不能在按钮前留空格。我尝试添加隐形按钮,但没有任何改变。

for (int i = 0; i < gameSize; i++ ){
        c.gridwidth = (i+1)*2;
        c.gridx = 0;
        c.gridy = 4*i;
        JRadioButton temp = new JRadioButton();
        temp.setVisible(false);
        board.add(temp,c);
        for(int j = 0; j < gameSize; j++){
            c.gridwidth = 4;
            c.gridx = 2+(4*j);
            c.gridy = 2+(4*i);
            cells[i][j] = new JButton();
            cells[i][j].setBackground(Color.white);
            board.add(cells[i][j],c); 
        }
    }

看起来像[这个:

https://i.stack.imgur.com/RFoz9.png

当我让它们可见时。我不明白为什么它们的宽度仍然是 4,即使我将它分配给 (i+1)*2。

我是 Java 新手,也是 Java GUI 的新手。所以,也许我没有弄清楚最基本的事情。谢谢指教!

解决方法

我创建了以下 GUI。

Staggered Layout

为了做到这一点,我不得不结合使用 Swing 布局。

每行上的按钮都是在带有 JPanelGridLayout 中创建的。该行是使用带有 JPanel 的行 FlowLayout 创建的,使用虚拟 JLabel 和按钮行 JPanel

JPanel 使用 (0,1) 的 GridLayout 来创建交错效果。每行中的虚拟 JLabel 变大 JButtons 大小的一半。

这是完整的可运行代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

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

public class GridBagLayoutStaggeredGUI implements Runnable {

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

    @Override
    public void run() {
        JFrame frame = new JFrame("Staggered Layout");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createMainPanel(),BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createMainPanel() {
        int gameSize = 8;
        int buttonSize = 50;
        int inset = 2;
        JButton[][] cells = new JButton[gameSize][gameSize];
        
        JPanel panel = new JPanel(new GridLayout(0,1));
        panel.setBorder(BorderFactory.createEmptyBorder(5,5,5));
        
        for (int i = 0; i < gameSize; i++) {
            JPanel innerPanel = new JPanel(
                    new FlowLayout(FlowLayout.LEADING,0));
            JLabel label = new JLabel();
            label.setPreferredSize(new Dimension(inset,buttonSize));
            innerPanel.add(label);
            innerPanel.add(createRowPanel(cells[i],buttonSize));   
            
            panel.add(innerPanel);
            
            inset += buttonSize / 2;
        }
        
        return panel;
    }
    
    private JPanel createRowPanel(JButton[] cells,int buttonSize) {
        JPanel panel = new JPanel(new GridLayout(0,cells.length,0));
        
        for (int i = 0; i < cells.length; i++) {
            cells[i] = new JButton();
            cells[i].setBackground(Color.white);
            cells[i].setPreferredSize(new Dimension(buttonSize,buttonSize));
            panel.add(cells[i]);
        }
        
        return panel;
    }

}
,

GridBagLayout 只能计算列的宽度,前提是该列中添加了一个“gridwidth”为 1 的组件。

在您的示例中,您有 6 个按钮,每个按钮的“网格宽度”为 2,这意味着您确实需要 12 列。但是每列的宽度应该是多少?

下面的例子展示了如何为每一列分配一个最小宽度。现在 12 列中的每一列都将具有基于指定值的最小宽度。

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;

public class GridBagLayoutMRE extends JPanel
{
    public GridBagLayoutMRE()
    {
        int gameSize = 6;
        int columnsNeeded = (gameSize * 3);
        int cellSize = 30;
        Dimension buttonSize = new Dimension(cellSize * 2,cellSize);

        GridBagLayout gbl = new GridBagLayout();
        setLayout( gbl );

        int[] columnWidths = new int[columnsNeeded];
        Arrays.fill(columnWidths,cellSize);
        gbl.columnWidths = columnWidths;

        GridBagConstraints gbc = new GridBagConstraints();

        for (int i = 0; i < gameSize; i++)
        {
            gbc.gridx = 0;
            gbc.gridy = i;
            gbc.gridwidth = 1;

            JRadioButton rb = new JRadioButton();
            rb.setPreferredSize( new Dimension(60,cellSize) );
            add(rb,gbc);

            gbc.gridx = i + 1;
            gbc.gridwidth = 2;

            for (int j = 0; j < gameSize; j++)
            {
                JButton button = new JButton();
                button.setPreferredSize( buttonSize );
                add(button,gbc);

                gbc.gridx = gbc.gridx + gbc.gridwidth;
            }
        }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("GridBagLayoutMRE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout( new GridBagLayout() );
        frame.add(new GridBagLayoutMRE());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。