【问题标题】:What is setBounds and how do I use it?什么是 setBounds 以及如何使用它?
【发布时间】:2013-10-25 06:16:15
【问题描述】:

我在 setBounds 上找不到任何内容、它的用途或它的实际功能。有人可以澄清我吗?非常感谢!

【问题讨论】:

    标签: java setbounds


    【解决方案1】:

    如果将layout 设置为null,则可以使用setBounds(x, y, width, height) 指定GUI 组件的位置和大小。那么(x, y)就是那个组件的左上角坐标。

    【讨论】:

    • 既然可以使用 setLocation 和 setPreferredSize,为什么还要这样做?
    • @JeremyFrancis setBoundssetLocationsetSize 的捷径。 setPreferredSize 向布局管理器 API 提供有关组件“希望”大小的提示
    • @MadProgrammer 提示是什么意思?为什么 setSize 有时有效而 setPreferredSize(new Dimension()) 有时有效?这与布局管理器有关吗?
    • @madProgrammer 也是,setBounds() 只是设置大小和设置位置的一种捷径吗?或者它还有什么其他功能或用途?
    • @JeremyFrancis 是的。当组件在布局管理器的控制下时调用setSize 只会有临时效果。一旦容器失效,组件将返回到布局管理器决定的大小。 preferredSize 只是给布局管理器的关于组件可能如何布局的建议。布局管理器完全可以忽略它,BorderLayout 就是一个很好的例子
    【解决方案2】:

    setBounds 用于定义组件的边界矩形。这包括它的位置和大小。

    在框架内的许多地方都使用了。

    • 布局管理器使用它来定义组件在其父容器中的位置和大小。
    • 绘制子系统在绘制组件时使用它来定义剪切边界。

    在大多数情况下,您永远不应该调用它。相反,您应该使用适当的布局管理器,并让他们确定向此方法提供信息的最佳方式。

    【讨论】:

    • 所以基本上我应该只在使用空布局时调用它?
    • @JeremyFrancis 我认为在处理基于组件的 UI 时,您永远不应该使用 null 布局;)
    • 但是在很多情况下使用空布局是必不可少的吗? (例如,移动组件以获得动画外观或其他内容)
    • @JeremyFrancis 并非如此,我已经为example 创建了一个包装布局,然后再为现有布局设置动画。布局解决了现代 UI 开发中最烦人的问题之一,即字体呈现方式的差异。它们允许您定义组件之间的关系,处理不同系统和操作系统之间的字体指标、DPI、屏幕分辨率等方面的差异
    【解决方案3】:

    这是java.awt.Component 类的方法。用于设置组件的位置和大小:

    setBounds

    public void setBounds(int x,
                      int y,
                      int width,
                      int height) 
    

    移动此组件并调整其大小。左上角的新位置由 x 和 y 指定,并且 新尺寸由宽度和高度指定。参数:

    • x - 该组件的新 x 坐标
    • y - 该组件的新 y 坐标
    • width - 该组件的新宽度
    • height - 该组件的新高度

    xy 在大多数(所有?)情况下对应于左上角。

    这是setLocationsetSize 的快捷方式。

    这通常仅在布局/布局管理器不存在时才有效,即 null。

    【讨论】:

    • x 和 y 对应左上角,你写到右上角了吗??
    【解决方案4】:

    @hexafraction 有一个答案,他指定 x 和 y 为右上角,这是错误的,那些是左上角。

    我也提供了出处,请查收。

    public void setBounds(int x,
                 int y,
                 int width,
                 int height)
    

    移动此组件并调整其大小。左上角的新位置由 x 和 y 指定,新大小由 width 和 height 指定。 此方法更改布局相关信息,因此使组件层次结构无效。

    参数:

    x - 该组件的新 x 坐标

    y - 该组件的新 y 坐标

    width - 该组件的新宽度

    height - 该组件的新高度

    来源:-setBounds

    【讨论】:

      【解决方案5】:

      其实一个 Swing 组件确实有多个维度,如:

      • 当前大小 - setSize() 和 setBounds() 设置这个
      • 最小尺寸 - setMinimumSize() 设置这个
      • 首选尺寸 - setPerferredSize() 设置此项
      • 最大尺寸 - setMaximumSize() 设置这个。

      SetBounds 是设置小部件当前大小和位置的快捷方式如果您不使用任何布局管理器。

      如果您使用布局管理器,布局管理器有责任布置您的组件,同时考虑您设置的首选大小,并确保组件永远不会小于其 minimumSize 或大于其 maximumSize。

      这种情况下layoutManager会调用setSize(或setBounds),你无法真正控制组件的位置或尺寸。

      使用布局管理器的全部意义在于拥有一种独立于平台和窗口大小的方式来自动布局组件,因此您不要期望从代码中调用 setSize。

      (个人评论:有错误的布局管理器,我个人讨厌所有这些并推出了我自己的,它提供了 MigLayout 的灵活性而没有学习曲线。)

      【讨论】:

        【解决方案6】:

        Java Swing UI 的工作方式是,对于每个 JPanel,始终有一个 LayoutManager 来决定组件的确切放置位置。 每个布局管理器的工作方式不同,因此如果您使用例如 BorderLayout,则 LayoutManager 不会使用 setBounds(),而是由 East、West、South、North、Center 决定组件放置。

        但是,对于 NullLayoutManager(如果您使用 new JPanel(null)),每个组件都必须有一个 x 和 y 坐标。愚蠢的旁注:如果你的 UI 是 3D 的,那么也会有一个 z 坐标。

        因此,使用public void Component.setBounds(int x, int y, int width, int height),您可以指定组件的放置位置以及它的宽高像素数。

        这是一个例子:

        import java.awt.Dimension;
        import javax.swing.JFrame;
        import javax.swing.JLabel;
        import javax.swing.JPanel;
        
        public class JTableInNullLayout
        {
          public static void main(String[] argv) throws Exception {
        
              JPanel panel = new JPanel(null);
        
              JLabel helloLabel = new JLabel("Hello world!");
              helloLabel.setBounds( 10, 50, 60, 20 ); // x, y, width, height
              panel.add(helloLabel);
        
              JFrame frame = new JFrame();
              frame.add(panel);
              frame.setPreferredSize( new Dimension(200,200));
              frame.pack();
              frame.setVisible(true);
          }
        }
        

        【讨论】:

          【解决方案7】:

          这是这篇文章How to Make Frames (Main Windows) - The Java Tutorials - Oracle 的一小段,它解释了 setBounds 方法以及其他一些类似方法的作用:

          pack 方法调整框架的大小,使其所有内容都等于或大于它们的首选大小。 pack 的替代方法是通过调用 setSize 或 setBounds(也设置帧位置)显式建立帧大小。一般来说,使用 pack 比调用 setSize 更可取,因为 pack 让框架布局管理器负责框架大小,而布局管理器擅长调整平台依赖性和其他影响组件大小的因素。

          setBounds的参数是(int x, int y, int width, int height) x 和 y 定义位置/位置,宽度和高度定义框架的大小/尺寸。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-10
            • 2015-03-13
            • 2014-11-19
            • 1970-01-01
            • 2011-11-01
            相关资源
            最近更新 更多