Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java setPreferredSize的副作用是什么?_Java_Swing - Fatal编程技术网

Java setPreferredSize的副作用是什么?

Java setPreferredSize的副作用是什么?,java,swing,Java,Swing,我有一个包含多个面板的窗口。我没有访问窗口代码的权限。(我只能修改面板的代码。) 我从面板上卸下了几个组件。窗户缩小了。但窗口太小,无法正确显示所有内容 我添加了行setPreferredSize(getPreferredSize())。现在窗户大小合适了 setPreferredSize的副作用是什么 编辑:使用边界布局。它应该忽略getXXXSize()。我的小组在中间。不适合屏幕的面板在北面。是的,效果很好。效果取决于 正在使用的布局管理器 在其上设置首选大小的组件 主要原因是,一旦调用s

我有一个包含多个面板的窗口。我没有访问窗口代码的权限。(我只能修改面板的代码。)

我从面板上卸下了几个组件。窗户缩小了。但窗口太小,无法正确显示所有内容

我添加了行
setPreferredSize(getPreferredSize())。现在窗户大小合适了

setPreferredSize的副作用是什么


编辑:使用边界布局。它应该忽略getXXXSize()。我的小组在中间。不适合屏幕的面板在北面。

是的,效果很好。效果取决于

  • 正在使用的布局管理器
  • 在其上设置首选大小的组件
  • 主要原因是,一旦调用setPreferredSize()来设置大小,组件将不再要求ui获取首选大小。理想情况下,只有组件的ui委托知道组件的理想pref大小。一旦您自己设置了pref大小,用户界面将不会查询pref大小

    为清楚起见,请参阅jComont.getPreferredSize()代码:


    现在为什么它依赖于布局管理器,因为只有一些布局调用(使用)getPreferredSize()进行计算。例如,flowlayout使用pref size,但边框布局不使用

    • getPreferredSize()
      查看大小是否在之前设置过。如果没有,该方法会询问组件本身(即您的JPanel)的LayoutManager有关首选大小的信息,然后根据组件计算出该大小
    • setPreferredSize(…)
      然后在JPanel上设置此值,并将其存储以备以后使用
    • 稍后您将删除JPanel的一些组件
    • 甚至在以后,当窗口尝试重新布局自己(或被告知这样做)时,窗口的(或contentpane的/RootPane的/…)布局管理器再次调用JPanel的
      getPreferredSize()
      方法
    • 现在
      getPreferredSize()
      不询问JPanel的LayoutManager,只返回先前由
      setPreferredSize()
      设置的存储大小
    对于宽度,BorderLayout忽略了北部和南部组件的首选宽度,它只考虑中心、东部和西部。(高度也一样)

    我刚刚看了一下BorderLayout.preferredLayoutSize的实现(在Sun的1.6.0_13中),它的工作原理如下:

    宽度计算如下:

    max(  EAST.width + CENTER.width + WEST.width + h-gaps,
          NORTH.width, SOUTH.width ) + insets
    
    max( EAST.height, CENTER.height, WEST.height)
    + NORTH.height + SOUTH.height + v-gaps + insets
    
    高度计算如下:

    max(  EAST.width + CENTER.width + WEST.width + h-gaps,
          NORTH.width, SOUTH.width ) + insets
    
    max( EAST.height, CENTER.height, WEST.height)
    + NORTH.height + SOUTH.height + v-gaps + insets
    
    (每个
    宽度
    /
    高度
    都是这些组件的
    首选尺寸
    的值。) 如果缺少五个组件中的某些组件,则不包括它们的高度/宽度,间隙也不包括在内。)

    它同样适用于
    minimalLayoutSize
    ,而
    maximumLayoutSize
    只返回
    Integer.MAX\u值

    因此,原则上它应该是开箱即用的

    但一般来说,如果窗口的布局不在您的控制之下,您不必担心不在您控制之下的组件被切断:-)

    方法setPreferredSize()没有副作用

    Suraj Chandran描述了getPreferredSize()的工作原理


    Paŭlo Ebermann解释了setPreferredSize(getPreferredSize())工作的原因。

    我不知道副作用,但这可以帮助您理解setPreferredSize():set(首选/最小/最大)Size()只不过是提示父组件及其layoutmanager该组件应获得多少空间。这些大小仅在布局组件时解释。@True。我应该在使用中包含布局管理器。问题已更新。是的,但在所有内容都添加到我的面板后调用setPreferredSize(getPreferredSize())不会影响结果,是吗?在注释中回答我的问题:会的。不可见组件不参与getXXXSize()。javadoc:“组件根据其首选尺寸和容器尺寸的限制进行布置。北部和南部组件可以水平拉伸;东西向分量可以垂直拉伸;中心组件可以水平和垂直拉伸以填充剩余的空间。“我忽略了一点,即它也可以被压缩。:(右?文档在这里没有太大帮助…是的,如果必要,它们也会被压缩。BorderLayout的文档没有描述首选(以及最小/最大)布局的方式整个容器的大小(
    preferredLayoutSize()
    )都是计算出来的。事实上,它考虑了所有组件,我会更新我的答案。