GridBagLayout不遵守长方形的形状要求 - java

我正在使用秋千尝试制作一个垄断委员会。我试图将开发板上的属性/空间作为独立的JPanels放置,它们可以具有自己的实现,信息等,但是我在空间形状方面遇到了一些麻烦。我正在使用GridBagLayout(我对这个布局管理器还很陌生),并且我试图对面板进行布局,以使侧面JPanels的gridwidth = 4,gridheight = 3(请参阅随附的代码)。但是,当我运行并查看它时,面板是正方形的。我确认当我将gridheight更改为2或1时,这是行不通的,它仍然显示为正方形(我原本希望JPanels的形状是更长的长方形)。

原谅命名方案,在我在主要垄断程序中实现gui之前,我只是在Eclipse中一个单独的临时项目文件中尝试这种布局。

import static java.awt.GridBagConstraints.*;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

public class MainFrame extends JFrame {

    private static final long serialVersionUID = 1L;




    public MainFrame() {
        super();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Dimension screenSize = getToolkit().getScreenSize();
        setSize(screenSize.height, screenSize.height);

        setLocationRelativeTo(null);

        setLayout(new GridBagLayout());

        addCorners();

        addEdges();
        setVisible(true);

        addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                System.out.println("Component resized");
                int width = getWidth();
                int height = getHeight();
                System.out.println(width + " " + height);
                super.componentResized(e);
            }
        });
    }

    private int startingColRow = 4;
    private int endingColRow = 28;

    private int bigWidth = 4;
    private int smallWidth = 3;

    private int startingEdge = 0;
    private int endingEdge = 31;




    private void addEdges() {
        addLeftEdge();
        addTopEdge();
        addBottomEdge();
        addRightEdge();
    }




    private void addCorners() {
        addTopLeftCorner();
        addBottomLeftCorner();
        addTopRightCorner();
        addBottomRightCorner();

    }




    private void addCorner(int anchor, int gridx, int gridy) {
        add(getWhiteJPanel(), getGridBagConstraints(anchor, gridx, gridy, bigWidth, bigWidth));
    }




    private void addBottomRightCorner() {
        addCorner(SOUTHEAST, endingEdge, endingEdge);
    }




    private void addTopRightCorner() {
        addCorner(NORTHWEST, endingEdge, startingEdge);
    }




    private void addBottomLeftCorner() {
        addCorner(SOUTHWEST, startingEdge, endingEdge);
    }




    private void addTopLeftCorner() {
        addCorner(NORTHEAST, startingEdge, startingEdge);
    }




    public void addLeftEdge() {
        for (int row = startingColRow; row <= endingColRow; row += smallWidth) {
            add(getWhiteJPanel(), getGridBagConstraints(WEST, startingEdge, row, bigWidth, smallWidth));
        }
    }




    public void addRightEdge() {
        for (int row = startingColRow; row <= endingColRow; row += smallWidth) {
            add(getWhiteJPanel(), getGridBagConstraints(EAST, endingEdge, row, bigWidth, smallWidth));
        }
    }




    public void addBottomEdge() {
        for (int col = startingColRow; col <= endingColRow; col += smallWidth) {
            add(getWhiteJPanel(), getGridBagConstraints(SOUTH, col, endingEdge, smallWidth, bigWidth));
        }
    }




    public void addTopEdge() {
        for (int col = startingColRow; col <= endingColRow; col += smallWidth) {
            add(getWhiteJPanel(), getGridBagConstraints(NORTH, col, startingEdge, smallWidth, bigWidth));
        }
    }




    private static JPanel getWhiteJPanel() {
        JPanel panel = new JPanel();
        panel.setBackground(Color.WHITE);
        panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        return panel;
    }




    private GridBagConstraints getGridBagConstraints(int anchor, int gridx, int gridy, int gridwidth, int gridheight) {
        GridBagConstraints c = new GridBagConstraints();
        c.fill = VERTICAL;
        c.weightx = c.weighty = 1;

        c.anchor = anchor;
        c.gridx = gridx;
        c.gridy = gridy;
        c.gridwidth = gridwidth;
        c.gridheight = gridheight;

        return c;
    }




    public static void main(String[] args) {
        new MainFrame();
    }
}

java大神给出的解决方案

我对您的c.fill = VERTICAL有点困惑,我以为BOTH。除此之外,如果窗口是正方形的,那么木板将具有正方形区域,如果窗口是长方形的,则将具有长方形区域。此处的Gridwidth和greighteight完全无关。相反,如果要使对象的面积在一个轴上重叠,则可以使用这些对象。最好将网格袋布局视为一个大网格。然后gridwidth和gridheight告诉布局给定对象应占据多少列或行。但是没有什么可说的是,列的宽度应与行的高度一样宽。实际上,没有什么可以说行或列具有相同的大小。所以我想说您对GridBagLayout的运行方式有一些不正确的想法。

如果要固定宽高比,则应为各个窗格设置首选尺寸,然后将整个板包装到滚动视图中。这样可以确保所有内容均以首选尺寸显示。不过,不确定滚动是否适合您的情况。如果没有,您可以尝试使用具有适当布局的外部容器,该布局将使内部容器增长到其首选大小,而不是更大。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java

我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…

如何使用BorderLayout(Java)扩展JTextField - java

我有一个Java程序,其中使用的是JTextField,但如果我未指定默认大小,则其宽度为0。我将其插入BorderLayout中,因此如何制作它展开以填充整个容器? java大神给出的解决方案 在上面的示例中,文本字段将正常工作。但是,如果您插入EAST或WEST,则将不起作用。import java.awt.BorderLayout; import ja…

无法在Eclipse中调试条件中的最后一条语句? - java

public static void main(String args[]) { if(true) { int x= 3*44+7; //int y=1; } } 我将问题缩小为这个简单的语句,我真的不知道如何在Eclipse调试器中访问此变量。它总是在以下情况下发生:在if条件中声明变量,try-catch语句,循环等,并且偶然地是该块中的最后一个语句。为…