【问题标题】:When is preferredLayoutSize called?什么时候调用 preferredLayoutSize?
【发布时间】:2013-08-08 12:37:52
【问题描述】:

所有java布局管理器都需要preferredLayoutSize(Container parent),但是这个方法什么时候调用呢?

以下代码在GridLayout.java中找到:

public Dimension preferredLayoutSize(Container parent) {
  synchronized (parent.getTreeLock()) {

      System.out.println(parent.getWidth() + " " + parent.getHeight());

    Insets insets = parent.getInsets();
    int ncomponents = parent.getComponentCount();
    int nrows = rows;
    int ncols = cols;

    if (nrows > 0) {
        ncols = (ncomponents + nrows - 1) / nrows;
    } else {
        nrows = (ncomponents + ncols - 1) / ncols;
    }
    int w = 0;
    int h = 0;
    for (int i = 0 ; i < ncomponents ; i++) {
        Component comp = parent.getComponent(i);
        Dimension d = comp.getPreferredSize();
        if (w < d.width) {
            w = d.width;
        }
        if (h < d.height) {
            h = d.height;
        }
    }
    return new Dimension(insets.left + insets.right + ncols*w + (ncols-1)*hgap,
                         insets.top + insets.bottom + nrows*h + (nrows-1)*vgap);
  }
}

但是如果我把上面的所有代码都改成下面的会有什么不同呢?

public Dimension preferredLayoutSize(Container parent) {
  return new Dimension(parent.getWidth(), parent.getHeight());
}

谢谢。

【问题讨论】:

  • 但是如果我把上面所有的代码都改成下面的会有什么不同呢?可能只有一个(第一个或最后一个)JComponent 将占据整个区域(来自容器),GridLayout 有行和列
  • System.out.println in GridLayout.java?嗯...)
  • @mKorbel 当我使用 GridLayout 时,我根本没有看到这个方法被调用。所以我想知道在什么情况下会调用这个方法。
  • 打包、setPreferredSize、(重新)验证、调整容器大小

标签: java swing layout-manager preferredsize


【解决方案1】:

preferredLayoutSize()Containers 的默认首选大小。也就是说,如果容器具有布局管理器,Container.getPreferredSize() 将返回该值,除非它被覆盖以返回其他内容,或者已使用 setPreferredSize() 指定了另一个值。

改成

public Dimension preferredLayoutSize(Container parent) {
    return new Dimension(parent.getWidth(), parent.getHeight());
}

这意味着容器不会尝试考虑内容,但总是会返回其当前大小。

【讨论】:

    【解决方案2】:

    只需在 IDE 中按 Method usage 热键...

    com.sun.java.swing.plaf.motif - rt.jar
       -MotifFileChooserUI
          --getPreferredSize(JComponent)
       -MotifPopupMenuUI
          --getPreferredSize(JComponent)
    com.sun.java.swing.plaf.windows - rt.jar
       -WindowsFileChooserUI
          --getPreferredSize(JComponent)
    java.awt - rt.jar
       -Container
          --getPreferredSize() (2 matches)
          --preferredSize()
    javax.swing.plaf.basic - rt.jar
       -BasicDesktopIconUI
          --getPreferredSize(JComponent)
       -BasicInternalFrameUI
          --getPreferredSize(JComponent)
       -BasicOptionPaneUI
          --getPreferredSize(JComponent)
    javax.swing.plaf.metal - rt.jar
       -MetalFileChooserUI
          --getPreferredSize(JComponent)
    

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 2014-03-27
      • 2010-10-18
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多