Я всегда вижу на этом сайте советы по переопределению getPreferredSize()
вместо использования setPreferredSize()
, как показано, например, в этих предыдущих темах.
- Использование переопределения getPreferredSize() вместо использования setPreferredSize() для компонентов фиксированного размера
- Должен ли я избегать использования set(Preferred| Максимум|Минимум) Методы размера в 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 делегата пользовательского интерфейса возвращает ненулевое значение, верните его; в противном случае обратитесь к менеджеру компоновки компонента.
Таким образом, это явно нарушает принцип подстановки Лисков.
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.
, но не как.
lsp
, возможно, делая нашinmutableSizeComponent
и выбрасывая исключение, не поддерживающее - person nachokk   schedule 11.01.2014