我总是看到在这个网站上重写getPreferredSize()而不是使用setPreferredSize()的建议,例如这些以前的线程所示.

> Use of overriding getPreferredSize() instead of using setPreferredSize() for fixed size Components
> Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?
> Overriding setPreferredSize() and getPreferredSize()

看这个例子:

public class MyPanel extends JPanel{

  private final Dimension dim = new Dimension(500,500); 

  @Override
  public Dimension getPreferredSize(){
      return new Dimension(dim);
  }

 public static void main(String args[]){
      JComponent component = new MyPanel();
      component.setPreferredSize(new Dimension(400,400));
      System.out.println(component.getPreferredSize());
 }

}

有必要对setPreferredSize()

  • Sets the preferred size of this component.

的getPreferredSize()

  • If the preferredSize has been set to a non-null value just returns it. If the UI delegate’s getPreferredSize method returns a non null
    value then return that; otherwise defer to the component’s layout
    manager.

所以这样做清楚地打破了Liskov Substitution Principle.

prefferedSize是一个绑定属性,所以当你设置一个firePropertyChange被执行.所以我的问题是当你重写getPrefferedSize()不需要重写setPreferredSize(..)吗?

例:

public class MyPanel extends JPanel{

  private Dimension dim = null; 

  @Override
  public Dimension getPreferredSize(){
      if(dim == null)
       return super.getPreferredSize();
      return new Dimension(dim);
  }

  @Override
  public void setPrefferedSize(Dimension dimension){
        if(dim == null)
            dim = new Dimension(500,500);
        super.setPreferredSize(this.dim); //
  }

 public static void main(String args[]){
      JComponent component = new MyPanel();
      component.setPreferredSize(new Dimension(400,400));
      System.out.println(component.getPreferredSize());
 }

}

现在我们看到我们得到相同的结果,但是听众将会收到真正的值的通知,而且我们不会破坏LSP的原因setPreferredSize states设置这个组件的首选大小.但不是如何.

解决方法

这个有趣的问题的几个方面(Mad已经提到了我的同伴开发者)

我们是否违反了只覆盖getXXSize()(和setXXSize())的LSP?

不,如果我们正确地执行:-)第一个权限是属性的api文档,最好从它的起源,即组件:

Sets the preferred size of this component to a constant value. Subsequent calls to getPreferredSize will always return this value.

这是一个有约束力的合同,但是我们实现了getter,它必须遵守恒定值,如果设置:

@Override
public Dimension getPreferredSize() {
    // comply to contract if set
    if(isPreferredSizeSet())
        return super.getPreferredSize();
    // do whatever we want
    return new Dimension(dim);
}

XXSize是一个绑定的属性 – 是吗?

在JComponent的祖先中,仅有间接证据:实际上,组件在setter中触发PropertyChangeEvent. JComponent本身似乎记录了事实(粗体我):

@beaninfo
preferred: true
bound: true
description: The preferred size of the component.

哪个是…错误的:被绑定的属性意味着每当值改变时,需要通知监听器,这就是以下(伪测试)必须通过的:

JLabel label = new JLabel("small");
Dimension d = label.getPreferredSize();
Propertychangelistener l = new Propertychangelistener() ...
    boolean called;
    propertyChanged(...) 
        called = true;
label.addPropertychangelistener("preferredSize",l);
label.setText("just some longer text");
if (!d.equals(label.getPreferredSize())
   assertTrue("listener must have been notified",l.called);

…但失败.由于某些原因(不知道为什么这可能被认为是适当的),他们希望xxSize的常数部分是一个绑定的属性 – 这样的覆盖是根本不可能的.当然可以(疯狂地猜测)一个历史性的问题:起初,只有摆放者才能获得(因为很好的理由).在它的backport到awt它突变成一个bean属性,它从来没有.

java – 覆盖getPreferredSize()中断LSP的更多相关文章

  1. javascript – jQuery切换div的子项

    我有以下HTML代码:classhidden有display:none当我点击单词菜单或menu2时,我正试图让切换工作解决方法小提琴:http://jsfiddle.net/maniator/V4X4t/更新检查点击的暗淡元素:小提琴:http://jsfiddle.net/maniator/V4X4t/5/

  2. R .C接口:传递多维数组

    我在C中编写了一个函数“foo”,我想从R程序中调用它.该函数接受矩阵作为输入并对其执行一些操作.虽然单个矢量很容易用foo实现的如何传入二维数组?如果我将“double*x”更改为“double**x”,则会出现分段错误.任何指针赞赏.解决方法没有必要放弃.C这样的直接操作.请记住,R中的矩阵是矢量维度.同样在C中,因此传递矩阵及其尺寸,并将矩阵的元素作为适当的偏移量进入矢量.就像是所以使用内联作为一个很好的派对技巧

  3. c – 更快地创建制表符分隔文本文件的方法?

    我的许多程序输出大量数据供我在Excel上查看.查看所有这些文件的最佳方法是使用制表符分隔文本格式.目前我使用这段代码来完成它:这似乎是一个非常慢的操作,是一种更有效的方式输出像这样的文本文件到硬盘驱动器?更新:考虑到这两个建议,新代码如下:以500KB/s的速度写入HD但这写入HD为50MB/s解决方法使用CIO,它比CIO快很多.我听说编程竞赛中的人们因为使用CIO而不是CIO而超时.只需将%d更改为正确的类型即可.

  4. Angular解决输入框由禁用状态转可用状态自动获取焦点失效问题

    而且会设置输入权限,会禁止用户输入。原因的话,我看了一下,估计是当我们改变输入框绑定的值得时候,输入框并没有切换状态,还是禁用状态,所以我们无法设置焦点,就是执行顺序的问题。

  5. 矢量矢量创建与vec!宏包含不同的容量

    我有一个vectormatrix_a,它包含3个向量,并用vec初始化!定义为:在你的情况下,这意味着:扩展到:Vec::from_elem的定义隐藏在文档中,但可以是foundinthesource:而这个神秘之心解决了:>元素被克隆n–1次,对于矢量的n-1个第一个元素,然后移动到第n个时隙.克隆一个向量不能克隆其容量,只有其元素.因此,您获得的结果与预期完全一致,如果不是预期的话.

  6. java – 覆盖getPreferredSize()中断LSP

    在JComponent的祖先中,仅有间接证据:实际上,组件在setter中触发PropertyChangeEvent.JComponent本身似乎记录了事实(粗体我):@beaninfopreferred:truebound:truedescription:Thepreferredsizeofthecomponent.哪个是…

  7. [cocos2d-x 2.0.4][iOS7]图片加载错误

    本篇文章由:http://www.sollyu.com/cocos2d-x-2-0-4-ios7-image-loading-errors/说明错误提示解决定位文件CCimage.mm并找到函数_initWithString函数原型找到代码▼代码位置大约在301行原理因为dim.width*4有可能不是整数,所以就来个强制类型转换。

  8. cocos2d-x在IOS7下面文字显示异常的解决办法

    http://blog.csdn.net/butwang/article/details/13003117由于xcode升级到了5.0,之前在cocos2d-x2.1.3下面的项目,出现了莫名其名的错误,主要是文字显示异常,明明有文字的,但就是不显示,后来搜了下,发现是需要修改cocos2d-x底层的相关设置,如果你在运行时出现文字显示异常,并且有如下提示:CGBitmapContextCreat

  9. 将多个参数传递给C中的线程(pthread_create)

    我试图将2个无符号整数传递给C中新创建的线程但是也没有2个整数或结构的数组似乎有效.在调用pthread_create之前,dim.width和dim.height是正确的.在我的套接字文件中,只设置了宽度,高度为0,我不明白为什么.有谁知道什么是错的,请问如何解决?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部