例如,我总是在这个站点中看到覆盖getPreferredSize()
而不是使用setPreferredSize()
这些先前线程中所示的建议。
- 使用覆盖 getPreferredSize() 而不是 setPreferredSize() 用于固定大小的组件
- 我应该避免在 Java Swing 中使用 set(Preferred|Maximum|Minimum)Size 方法吗?
- 覆盖 setPreferredSize() 和 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()
- 设置此组件的首选大小。
getPreferredSize()
- 如果 preferredSize 已设置为非空值,则返回它。如果 UI 委托的 getPreferredSize 方法返回非 null 值,则返回该值;否则遵从组件的布局管理器。
所以这样做显然违反了里氏替换原则。
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
状态Sets the preferred size of this component.
,但不会破坏如何。