Принуждение JComponent быть квадратным при изменении размера - PullRequest
2 голосов
/ 16 августа 2010

У меня есть JComponent, который выполняет пользовательское рисование и переопределяет следующие методы:

public Dimension getPreferredSize() {
    return new Dimension(imageWidth, imageHeight);
}

public Dimension getMinimumSize() {
    return new Dimension(imageWidth, imageHeight);
}

Где imageWidth и imageHeight - фактический размер изображения.

Я добавил его на панель содержимого с помощью SpringLayout:

layout.putConstraint(SpringLayout.SOUTH, customComponent, -10, SpringLayout.SOUTH, contentPane);
layout.putConstraint(SpringLayout.EAST, customComponent, -10, SpringLayout.EAST, contentPane);
layout.putConstraint(SpringLayout.NORTH, customComponent, 10, SpringLayout.NORTH, contentPane);

Таким образом, он ограничен севером и югом, поэтому при изменении размера он изменит свою высоту, а восток ограничен краем области содержимого, но запад может свободно двигаться влево.

Я бы хотел сохранить размер квадрата (ширина == высота) при изменении его размера. У кого-нибудь есть идеи, как это сделать?

1 Ответ

3 голосов
/ 16 августа 2010

Минимальные / предпочтительные / максимальные размеры являются только подсказками для менеджера макета. Чтобы принудительно задать определенный размер, вам нужно переопределить обработку размера в компоненте.

Все методы изменения размера / позиционирования (setHeight, setLocation, setBounds и т. Д.) В конечном итоге вызывают reshape. Переопределив этот метод в своем компоненте, вы можете заставить компонент быть квадратным.

void reshape(int x, int y, int width, int height) {
   int currentWidth = getWidth();
   int currentHeight = getHeight();
   if (currentWidth!=width || currentHeight!=height) {
      // find out which one has changed
      if (currentWidth!=width && currentHeight!=height) {  
         // both changed, set size to max
         width = height = Math.max(width, height);
      }
      else if (currentWidth==width) {
          // height changed, make width the same
          width = height;
      }
      else // currentHeight==height
          height = width;
   }
   super.reshape(x, y, width, height);
}
...