Я всегда вижу советы на этом сайте переопределения getPreferredSize()
вместо использования setPreferredSize()
, как показано в этих предыдущих потоках, например.
- Использование переопределения getPreferredSize() вместо использования setPreferredSize() для компонентов с фиксированным размером
- Следует ли мне избегать использования методов Set (Preferred | Maximum | Minimum) в Java Swing?
- Переопределение 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 установлено значение, отличное от нуля, он возвращает его. Если метод getPreferredSize делегата UI возвращает непустую значение затем возвращает это; в противном случае отложить до компоновки компонентов менеджер.
Таким образом, это явно нарушает Принцип замены Лискова.
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 Sets the preferred size of this component.
, но не так.