在调整大小时强制JComponent为正方形

时间:2010-08-15 23:01:55

标签: java swing resize jcomponent

我有一个执行自定义绘图的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 个答案:

答案 0 :(得分:3)

最小/首选/最大大小仅是布局管理器的提示。要强制使用特定大小,您需要覆盖组件中的大小处理。

所有调整大小/定位方法(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);
}