`
ybyonline
  • 浏览: 40217 次
  • 性别: 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();
}

}

分享到:
评论

相关推荐

    简单的网页浏览器

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

    java的小程序

    blafcheng.setPreferredSize(new Dimension(40,26)); blafchu.setPreferredSize(new Dimension(40,26)); blafkf.setPreferredSize(new Dimension(40,26)); blafpf.setPreferredSize(new Dimension(40,26)); ...

    javajishujishu

    g2.setLabel("文件拷贝进度:"+g2.getValue()); g2.setPreferredSize(300, 400); } protected void startApp() throws MIDletStateChangeException { // try{ // mainform.setItemStateListener...

    java 写的 qq软件 客户端 服务端

    this.setSize(faceSize); //设置运行时窗口的位置 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2, ...

    仿QQ登录窗体,拉伸展开!

    setSize(380,280); setIconImage(new ImageIcon("image\\tubiao.png").getImage()); Dimension displaySize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize=this.getSize(); ...

    带图片背景的面板

    public Mycanvas(){ setPreferredSize(new Dimension(800,600)); tool=getToolkit(); myimage=tool.getImage(&quot;炼铁/image/卡通/魔卡3.jpg&quot;); setOpaque(false); } public void paintComponent(Graphics g...

    旅店管理系统界面-手工书写

    setPreferredSize(new Dimension(80, 60)); this.addMouseListener(this); } public void mouseClicked(MouseEvent arg0) {} public void mouseEntered(MouseEvent arg0) {} public void mouseExited...

    Socket聊天室源程序

    this.setSize(faceSize); //设置运行时窗口的位置 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2, ...

    Java 200行代码画了三种浪漫的圣诞树的实例代码

    如何用纯Java语言,200行代码,画三种不同的“圣诞树”,直接使用Graphics2D进行绘制一层树层,然后封装成组件可以重复使用。最后把几个树层堆积起来,添加上树干... tree.setPreferredSize(new Dimension(550,650)); }

    《JAVA游戏程序设计教程》实验任务书.pdf

    setPreferredSize(new Dimension(width, heigth)); myball=new ball(this); mypad=new pad(this); this.setFocusable(true); this.requestFocus(); this.addKeyListener(this); } 2. 设计游戏循环,并通过线程来...

    JAVA编写的图书馆管理系统

    setSize(330,300); setVisible(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); add(text,BorderLayout.CENTER); try{ FileInputStream input=new FileInputStream(...

    java 写的浏览器 源代码

    scrollPane.setPreferredSize(new Dimension(100,500)); contentPane.add (scrollPane, BorderLayout.SOUTH); //在工具栏中添加按钮组件 toolBar.add(picSave); toolBar.addSeparator(); toolBar.add...

Global site tag (gtag.js) - Google Analytics