Swing中提供多种方式定义组件大小

setSize(),setLocation(),setBounds()

  • setSize(int width, int height):
    定义控件的大小,它有两个参数,设置控件的宽度和高度。
  • setLocation(int x, int y):
    将组件移到新位置,用x 和 y 参数来指定新位置的左上角坐标。
  • setBounds(int x,int y,int width,int,height)
    相当于两者结合体,x,y定义位置,width,height定义宽度和高度。
public void setBounds(int x,int y,int width,int height)
移动并调整此组件的大小。 左上角的新位置由x和y ,新尺寸由width和height 。
该方法更改布局相关信息,因此使组件层次结构无效。

参数
x - 这个组件的新的 x -coordinate
y - 这个组件的新 y-坐标
width -新 width这个组件的
height -新 height这个组件的

setPreferredSize( Dimension dim )
1.setPreferredSize()必须要在使用布局管理器的时候使用
2.而前三个方法不一定要在使用布局管理器时使用,其他时候也可以使用
3.它有一个参数,Dimension dim

JPanel panel = new JPanel();
Dimension dim = new Dimension(0,20);
panel.setPreferredSize(dim);

这样设置了 panel面板的高度为100,宽度随窗口变化。

其他函数

  • public void dispose()
    释放此窗口使用的所有原生屏幕资源、其子组件和所有所属子组件。也就是说,这些组件的资源将被销毁,它们消耗的任何内存都将返回到os,并且它们将被标记为不可显示。
  • public void pack()
    设置窗口的最佳大小
  • public void repaint()
    此方法会导致尽快调用此组件的更新方法。

问题描述

真正运用时候 会发现偶尔 方法是时灵时不灵

组件无法设置成自己想要的效果 就像代码失效一样?

核心区别

/**
     * Sets the <code>LayoutManager</code>.
     * Overridden to conditionally forward the call to the
     * <code>contentPane</code>.
     * Refer to {@link javax.swing.RootPaneContainer} for
     * more information.
     *
     * @param manager the <code>LayoutManager</code>
     * @see #setRootPaneCheckingEnabled
     * @see javax.swing.RootPaneContainer
     */
    public void setLayout(LayoutManager manager) {
        if(isRootPaneCheckingEnabled()) {
            getContentPane().setLayout(manager);
        }
        else {
            super.setLayout(manager);
        }
    }

英文解释

The short answer is: it’s complicated.
The slightly longer answer is: use setSize() if your component’s parent has no layout manager, and setPreferredSize() and its related setMinimumSize and setMaximumSize if it does.
setSize() probably won’t do anything if the component’s parent is using a layout manager; the places this will typically have an effect would be on top-level components (JFrames and JWindows) and things that are inside of scrolled panes. You also must call setSize if you’ve got components inside a parent without a layout manager.
As a general rule, setPreferredSize() should do the “right thing” if you’ve got a layout manager; most layout managers work by getting the preferred (as well as minimum and maximum) sizes of their components, and then using setSize() and setLocation() to position those components according to the layout’s rules. So (as an example) a BorderLayout will try to make the bounds of its “north” region equal to the preferred size of its north component - they may end up larger or smaller than that, depending on the size of the frame, the size of the other components in the layout, and so on

简单的回答是:这很复杂。

稍微长一点的答案是:
如果组件的父级没有布局管理器,则使用setSize();如果有,则使用setPreferredSize()及其相关的setMinimumSize和setMaximumSize。

如果组件的父级使用布局管理器,那么setSize()可能不会执行任何操作;这通常会对顶级组件(JFrames和JWindows)和滚动窗格内部的内容产生影响。如果在没有布局管理器的父级中有组件,则还必须调用setSize。

一般来说,如果您有布局管理器,那么setPreferredSize()应该做“正确的事情”;大多数布局管理器的工作方式是获取组件的首选(以及最小和最大)大小,然后使用setSize()和setLocation()根据布局规则定位这些组件。因此(例如)BorderLayout将尝试使其north区域的边界等于其north组件的首选大小-根据框架的大小、布局中其他组件的大小等,边界最终可能会大于或小于该大小

综上所述

  • setPreferredSize需要在使用布局管理器的时候使用,布局管理器会获取空间的preferredsize,因而可以生效。
  • setSize,setLocation,setBounds方法需要在不使用布局管理器的时候使用,也就是setLayout(null)的时候可以使用这三个方法控制布局。

感兴趣的小伙伴 可以去贴吧看看 链接在下面 自取

Swing 新手最常见的一些问题就是:

  • 为什么我的 setSize / setLocation / setBounds 没起作用?
  • 为什么我的界面布局很难看?
  • 为什么我把JPanel加进JScrollPane里,JScrollPane一直自动适应大小就是不显示滚动条?
  • …………

【Swing基础】布局管理器 - LayoutManager