【问题标题】:Can't get equal width columns with GridBagLayout layout manager无法使用 GridBagLayout 布局管理器获得等宽的列
【发布时间】:2017-06-14 21:22:04
【问题描述】:

我遇到了 GridBagLayout() 的问题,并且列宽均匀。本质上,我将三个按钮添加到带有 GridBagLayout 布局管理器的面板中。我希望(希望)按钮的宽度相同,并填充它们所在的单元格。但是,由于按钮的大小不同(取决于其中的文本),我最终会得到不同大小的按钮.下面是代码:

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;


public class ShitHeadGUI extends JPanel {

    public String[] s = new String[] {"Ace of Hearts", "2 of Diamonds", "3 of Clubs"};


    //JPanel pile = new JPanel();
    List<JPanel> hands = new ArrayList<JPanel>();
    GridBagConstraints cons = new GridBagConstraints();
    JFrame frame = new JFrame("Shithead");

    public ShitHeadGUI() {
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        this.setPreferredSize(new Dimension(300,300));

        cons.gridx = 0;
        cons.gridy = 0;
        cons.weightx = 1;
        cons.fill = GridBagConstraints.HORIZONTAL;

        for (int i = 0; i < 2; i++) {
            hands.add(new JPanel());
            hands.get(i).setLayout(new GridBagLayout());
            this.add(hands.get(i));
            cons.gridy++;
        }

        frame.setVisible(true);
        frame.add(this);
        frame.pack();   

        addCards(null);
    }

    public void addCards(Hand h) {

        List<JButton> btnCard = new ArrayList<JButton>();

        for (int i = 0; i < 3; i++) {//h.size(); i++) {
            cons.gridx = i;
            //btnCard.add(new JButton(h.getCard(i).toString()));
            btnCard.add(new JButton(s[i]));
            hands.get(0).add(btnCard.get(i), cons);
        }       
    }
}

“红桃 A”与“方块 2”的大小略有不同,“梅花 3”明显更小。我希望它们都具有相同的大小。任何帮助将不胜感激,谢谢!

【问题讨论】:

  • GridBagLayout永远不会使所有列的宽度相同。 GridBagLayout 单元格是灵活的;它们的大小总是取决于它们的内容。没有 GridBagConstraints 值可以改变这种行为。正如 Aubin 所说,使用 GridLayout 而不是 GridBagLayout。或者,如果您想要挑战,请使用 SpringLayout。
  • 按钮数量变化
  • 我的建议:找出最长的卡片名称字符串是什么。将此值用作静态最终值进行比较。编写一个方法,在将每个卡片名称添加到按钮之前将其传递给该方法。该方法应该检查长度。如果名称的长度低于最大值,则让该方法添加空格,然后返回“更正后的”字符串。将其添加到按钮。这有点老套,但可以解决您的问题。

标签: java gridbaglayout


【解决方案1】:

这是我在评论中谈到的方法的一个示例。这应该可以帮助您将 GridBagLayout 与长度完全相同的按钮一起使用。

您无法解决的事实是,如果长度差为奇数,则文本将永远不会完全居中。那么右边总是比​​左边多一个空格...

public class StringExtender {

    static final int maxCardNameLength = "Queen of Diamonds".length();


    public static void main (String args[]) {

        System.out.println(StringExtender.extend("2 of Spades").length());
        System.out.println(StringExtender.extend("Jack of Clubs").length());
        System.out.println(StringExtender.extend("King of Diamonds").length());
        System.out.println(StringExtender.extend("Queen of Diamonds").length());

    }

    // 
    static String extend(String cardName) {

        int diff = maxCardNameLength - cardName.length();
        int diffHalf = 0;
        String result = cardName;

        // is the String shorter than maximum?
        if(diff > 0) {
            // is the difference greater than 1?
            // if true, then always pad left and right
            if(diff > 1 ){
                diffHalf = diff/2;

                // add padding left
                String paddingLeft = "%" + (result.length() + diffHalf) + "s";
                result = String.format(paddingLeft, result);
                System.out.println("Result: |" + result + "|");
            }

            // add padding right
            String paddingRight = "%-" + (maxCardNameLength) + "s";
            result = String.format(paddingRight, result);
            System.out.println("Result: |" + result + "|");
        }

        return result;
    }
}

【讨论】:

  • 谢谢。我最终只是用 GridLayout 替换了 GridBagLayout。
【解决方案2】:

有一个小技巧......将所有组件的首选尺寸设置为一些愚蠢的小尺寸,例如:

setPreferredSize(new Dimension(2, 2));

并添加:

c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0; // fill all available space horizontally
c.weighty = 1.0; // fill all available space vertically

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2018-05-02
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多