【问题标题】:Java Container constraints questionJava 容器约束问题
【发布时间】:2011-02-12 12:22:00
【问题描述】:

我正在使用以下内容:

java.awt.Container.add(Component comp, Object constraints)

如何指定约束对象?我需要能够在容器中放置一个组件。

哦,如果这有帮助,我的课程将扩展 JInternalFrame...

我需要指定坐标以将组件放置在容器中

【问题讨论】:

    标签: java user-interface components


    【解决方案1】:

    constraints 对象取决于您使用的布局管理器。

    例如,BorderLayout 将只有一些常量:container.add(element, BorderLayout.CENTER)

    如果容器的布局管理器是 GridBagLayout,您将拥有一个带有指定参数的 GridBagConstraints 对象。

    一些布局管理器(如FlowLayout 或GridLayout)不需要任何类型的约束,因为它们实际上自己决定如何放置东西。

    附带说明,如果您需要绝对定位,您将没有任何布局管理器:

    container.setLayout(null);
    container.add(element1);
    
    Insets insets = pane.getInsets();
    element1.setBounds(..); //here you set absolute position
    

    【讨论】:

    • 谢谢。这几乎奏效了。例如,如果我使用 setBounds 来调整按钮的大小,无论如何我可以获得按钮的“默认”高度和宽度(即自动调整为其显示文本的大小),这样当我调用 setBounds 时我没有指定一个高度和宽度(只是一个 x,y 位置)?
    • 您可以预先计算一次并用于您添加的每个按钮,根据您应该使用的字体导出大小component.getFontMetrics(),然后您将有所需的方法(如 stringWitdh("foobar") )来获取尺寸..
    • 我实际上最终使用了 "componentName".getMinimumSize().width/height 以防有人遇到这个问题。
    • 一个简单的问题需要做很多工作。您不应该使用空布局。布局管理器的存在是有原因的。从长远来看,阅读本教程并为自己节省一些麻烦。
    【解决方案2】:

    来自java.awt.Containerclass'es javadoc:

    约束由正在使用的特定布局管理器定义。例如,BorderLayout 类定义了五个约束:BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.EAST、BorderLayout.WEST 和 BorderLayout.CENTER。

    GridBagLayout 类需要一个 GridBagConstraints 对象。未能传递正确类型的约束对象会导致 IllegalArgumentException。

    此评论可以在受保护的addImpl 方法中找到。

    【讨论】:

      【解决方案3】:

      看看tutorials for LayoutManagers!这些示例将向您展示哪些约束与哪些布局一起使用,以及如何使用。

      【讨论】:

      • +1,用于参考教程。这显然是一个初学者,教程充满了例子,可以比给出的其他答案中简单的一行句子更详细地解释什么约束。不仅如此,希望发帖者在发布下一个问题之前先查看“目录”以了解 Swing 的其他基本功能。
      【解决方案4】:

      正确的约束对象取决于当前的LayoutManager。

      例如,如果您使用BorderLayout,则约束对象可以是BorderLayout.SOUTH。

      【讨论】:

        【解决方案5】:

        这取决于您使用的布局管理器。例如,如果您使用BorderLayout,则可以使用BorderLayout.CENTER 和BorderLayout.NORTH 之类的值。如果您没有使用布局管理器,则需要手动设置组件的位置。

        【讨论】:

        • 如何手动执行此操作?我基本上需要给它“坐标”来指定它的位置。我只是不知道如何构造“约束”对象。
        • 您可以将null 传递给约束对象,并在组件上使用setBounds 或setLocation 来定位它。
        • 如果您手动设置边界和位置,则无需将任何约束传递给 add-method。但是布局管理器应该设置为null。
        • @aioobe:你是对的,当然。我已经很久没有没有使用过LayoutManagers了,我觉得它不太对。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多