Java - 与 GridBagLayout 的两个代码比较 - IllegalArgumentException

标签 java swing layout gridbaglayout illegalargumentexception

我刚刚测试了 GridBagLayout 的这段代码,我想知道为什么这段代码有错误,但其他代码却没有错误。此代码出现异常IllegalArgumentException:无法添加到布局:约束必须是字符串(或null):

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Layout extends JFrame
{
    gridbag g=new gridbag();

    public Layout()
    {
        add(g, BorderLayout.CENTER);
    }

    public static void main(String[]args)
    {
        Layout lay=new Layout();
        lay.setSize(500, 500);
        lay.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        lay.setLocationRelativeTo(null);
        lay.setVisible(true);
    }

    class gridbag extends JPanel
    {
        private JLabel label=new JLabel("Test");

        public gridbag()
        {
            setLayout(new GridBagLayout());

            GridBagConstraints gbc=new GridBagConstraints();            
            Container container=getContentPane();           
            addC(label, container, gbc, 0, 0, 1, 4, 0, 0);          
        }

        private void addC(Component c, Container container, GridBagConstraints gbc, int C, int R, int nC, int nR, double wX, double wY )
        {
            gbc.gridx=C;
            gbc.gridy=R;
            gbc.gridwidth=nC;
            gbc.gridheight=nR;
            gbc.weightx=wX;
            gbc.weighty=wY;

            container.add(c, gbc);
        }
    }
}

但是这段代码有效:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class gridbag extends JPanel
{
    private JLabel label=new JLabel("Test");

    public gridbag()
    {
        setLayout(new GridBagLayout());

        GridBagConstraints gbc=new GridBagConstraints();            
        Container container=this;
        addC(label, container, gbc, 0, 0, 1, 4, 0, 0);          
    }

    private void addC(Component c, Container container, GridBagConstraints gbc, int C, int R, int nC, int nR, double wX, double wY )
    {
        gbc.gridx=C;
        gbc.gridy=R;
        gbc.gridwidth=nC;
        gbc.gridheight=nR;
        gbc.weightx=wX;
        gbc.weighty=wY;

        container.add(c, gbc);
    }

    public static void main(String[]args)
    {
        gridbag g=new gridbag();
        JFrame frm=new JFrame();
        frm.setSize(500, 500);
        frm.add(g, BorderLayout.CENTER);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }
}

其中一个区别是 JFrame 有一个新的 Layout 类,而第二个代码直接使用 JFrame

最佳答案

问题就在这里,这是两个版本之间的另一个差异。

Container container=getContentPane();

尝试

Container container=this;      

关于Java - 与 GridBagLayout 的两个代码比较 - IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22898363/

相关文章:

java - 将 jpa bean 绑定(bind)到可取消表单的正确方法是什么?

java - 从网格布局到GridBagLayout

HTML:同侧文本溢出和对齐

java - Android的表单验证库?

java - 使用java抽象类

java - 如何使按钮监听器为您提供按下的按钮的坐标

java - 在 paintComponent 中绘制另一个组件

java - 除了按钮之外,一切正常。图形用户界面Java

android - 如何在 android 布局中打开 Intent - 到特定区域,而不是全屏

java - 在构造函数中尝试/捕获 - 推荐做法?