`
ybyonline
  • 浏览: 40960 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

setSize与setPreferredSize的区别

阅读更多

本文引自“http://hi.baidu.com/lianglongqun/blog/item/3247ff3e3dfe3b3771cf6c37.html

setPreferredSize用于布局管理器。

在使用布局管理器的时候,可以不使用setSize(),因为布局管理器会自动调用组件的setSize方法设置组件的大小。即使用户调用setSize方法设置组件大小,最终可能被覆盖。参照下面的布局管理器了解被覆盖的过程。

下面给出一个简单的布局管理器CenterLayout(将容器中的组件(最多只能有一个可见)居中显示)
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.io.Serializable;

public class CenterLayout implements LayoutManager, Serializable {

@Override
public void addLayoutComponent(String name, Component comp) {
}

// 将组件compont, 在父容器中居中显示
private void center(Container parent, Component component) {
    Dimension parentDimension = parent.getPreferredSize();
    Dimension d = component.getPreferredSize();
    int x = (parentDimension.width - d.width) / 2;
    if (x < 0) {
      x = 0;
    }
    int y = (parentDimension.height - d.height) / 2;
    if (y < 0) {
      y = 0;
    }
    component.setLocation(x, y);
}

// 返回并集
private Dimension union(Dimension d, Dimension d2) {
    return new Dimension(Math.max(d.width, d2.width), Math.max(
        d.height, d2.height));
}

@Override
public void layoutContainer(Container parent) {
    synchronized (parent.getTreeLock()) {
      Component[] components = parent.getComponents();
      // 最多只能有一个组件是可见的
      for (Component component : components) {
        if (component.isVisible()) {
          center(parent, component);
          // 这句不能少,否则组件不能显示,除非组件调用过setSize。
          //这句覆盖了用户之前调用的setSize方法。
          component.setSize(component.getPreferredSize());
          break;
        }
      }
    }
}

@Override
public Dimension minimumLayoutSize(Container parent) {
    return new Dimension(0, 0);
}

@Override
public Dimension preferredLayoutSize(Container parent) {
    synchronized (parent.getTreeLock()) {
      Component[] components = parent.getComponents();
      // 最多只能有一个组件是可见的
      for (Component component : components) {
        if (component.isVisible()) {
          // 不能调用parent.getPreferredSize(),否则导致死循环
          return union(parent.getSize(), component.getPreferredSize());
        }
      }
    }
    // 不能调用parent.getPreferredSize(),否则导致死循环
    return parent.getSize();
}

@Override
public void removeLayoutComponent(Component comp) {
}

@Override  
public String toString() {
    return getClass().getName();
}

}

分享到:
评论

相关推荐

    关于Draw2D里的Layout.doc

    在Draw2D中,`Figure`类的`setPreferredSize(Dimension)`与`setSize(Dimension)`方法有所不同。`setSize()`仅调用`repaint()`更新显示,而不触发布局的重新计算。相反,`setPreferredSize()`不仅设置了图形的首选...

    test5(设置对话框大小)

    设置对话框大小的方法通常包括`setSize()`和`setPreferredSize()`。例如,`dialog.setSize(width, height)`将对话框的宽度设为指定的width,高度设为height。`setPreferredSize(new Dimension(width, height))`则...

    Java组件练习.zip_Java组件应用_these2ai

    frame.setSize(400, 300); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setVisible(true); } } ``` 上述代码创建...

    设定对话框的大小

    你可以使用`setSize()`或`setPreferredSize()`方法设定大小: ```java JDialog dialog = new JDialog(frame, "我的对话框"); dialog.setSize(300, 200); ``` JavaFX中,使用`Dialog`类,通过`setWidth()`和`set...

    简单的网页浏览器

    this.setSize(1000,800); setResizable(false); this.setDefaultCloseOperation(EXIT_ON_CLOSE); Container contentPane=getContentPane(); scrollPane.setPreferredSize(new Dimension(100,500)); ...

    java Swing组件setBounds()简单用法实例分析

    从 API 来看,该方法的作用相当于 setLocation() 与 setSize() 的总和。 setBounds() 方法的使用 在实际使用时,需将容器的 layout 设置为 null,因为使用布局管理器时,控件的位置与尺寸是由布局管理器来分配的。...

    Java AWT应用示例 - 持续更新

    9. **组件的可见性与大小**: Component类是所有AWT组件的基类,提供了setVisible()方法控制组件的可见性,以及setSize()和setPreferredSize()方法调整组件的大小。 10. **窗口事件**: AWT中存在窗口事件,如...

    Swing页面属性的设置顺序

    2. **基本属性设置**:接着,可以设置组件的基本属性,比如大小(setSize()或setPreferredSize())、位置(setLocation())以及是否可见(setVisible())。 3. **外观与颜色**:然后,设置组件的外观属性,如背景色...

    java拼图小游戏项目开发教程.docx

    setSize(500, 500); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(() -&gt; { ...

    java圆按钮详细代码

    frame.setSize(150, 150); frame.setVisible(true); } } ``` 2. **构造函数解析**: - 初始化按钮,并设置其首选大小为正方形。 - 设置按钮内容区域不填充背景色,以便后续自定义绘制。 3. **...

    java布局设置按钮大小的设定

    fr.setSize(500, 200); fr.setResizable(true); ``` 这些方法使得开发者能够更精细地控制GUI界面的外观和行为,提供更加用户友好的体验。 总之,通过合理利用Java的布局管理器,尤其是`BorderLayout`,并结合组件...

    10.Swing.doc

    `setSize()`方法用于设置窗口的初始大小,而`setVisible(true)`使窗口可见。 Swing组件的设计遵循MVC(Model-View-Controller)模式,允许开发者分离界面逻辑和业务逻辑,提供更好的可维护性和可扩展性。此外,...

    java开发可安装程序exe的JFrame相关jar包.rar

    4. **显示与设置大小**:使用`setVisible(true)`使JFrame可见,`setSize(int width, int height)`或`setPreferredSize(Dimension dimension)`来设定窗口大小。 5. **窗口事件**:JFrame支持窗口事件,如关闭事件。...

    java点击按钮弹出自定义对话框

    - 设置位置和大小:`setLocation()`, `setSize()`或`setPreferredSize()`来调整对话框的位置和大小。 - 显示对话框:`setVisible(true)`来显示对话框。 3. **事件监听** - 在按钮上添加ActionListener,当按钮被...

    java JFrame,java se,javase

    2. 设置窗口大小:`setSize(int width, int height)`或`setPreferredSize(Dimension dim)`。 3. 设置窗口位置:`setLocation(int x, int y)`。 4. 设置窗口是否可最小化、最大化或关闭:`setResizable(boolean ...

    swing界面设计之Layou

    对于`JPanel`组件而言,直接调用`setSize()`方法设置大小往往不会生效,因为Swing的设计理念是依赖于布局管理器来自动调整组件的大小。正确的做法是: 1. **使用`setPreferredSize()`方法**:这允许指定首选尺寸,...

    实验06 GUI图形界面设计1.doc

    - `setSize`或`setPreferredSize`设置窗口大小。 - `setIconImage`设置窗口图标。 - `setLocation`或`setLocationByPlatform`指定窗口在屏幕上的位置。 - 背景颜色和背景图片的设置可能需要自定义组件的背景,这通常...

    根据文字内容调整Frame

    对于Frame,可以调用`setSize()`或`setPreferredSize()`方法;对于其他组件,可能需要调用`setBounds()`或`revalidate()`来更新其尺寸和位置。 4. **布局管理**:Java Swing提供了多种布局管理器,如FlowLayout、...

    使用Java AWT和Swing实现一个简单的图形用户界面.txt

    - 设置窗口尺寸:`frame.setSize(400, 300);` — 宽度为400像素,高度为300像素。 #### 5. 获取并设置容器布局 - **获取内容面板**:`Container container = frame.getContentPane();` - **设置布局管理器**:`...

Global site tag (gtag.js) - Google Analytics