2013-11-08 3 views
2

Я хочу, чтобы пользователь мог изменять размер/высоту JFrame, сохраняя при этом одинаковое соотношение между его шириной и высотой. Другими словами, я хочу заставить высоту изменить ширину, сохраняя ту же форму кадра.Как изменить размер JFrame при сохранении пропорций?

public void componentResized(ComponentEvent arg0) 
    { 
     int setHeight = arg0.getComponent().getHeight(); 
     int setWidth = arg0.getComponent().getWidth(); 
     double newWidth = 0; 
     double newHeight = 0; 
     { 
      if(setHeight != oldHeight) 
      { 
       heightChanged = true; 
      } 
      if(setWidth != oldWidth) 
      { 
       widthChanged = true; 
      } 
     } 
     { 
      if(widthChanged == true && heightChanged == false) 
      { 
       newWidth = setWidth; 
       newHeight = setWidth*HEIGHT_RATIO; 
      } 
      else if(widthChanged == false && heightChanged == true) 
      { 
       newWidth = setHeight * WIDTH_RATIO; 
       newHeight = setHeight; 
      } 
      else if(widthChanged == true && heightChanged == true) 
      { 
       newWidth = setWidth; 
       newHeight = setWidth*HEIGHT_RATIO; 
      } 
     } 

     int x1 = (int) newWidth; 
     int y1 = (int) newHeight; 
     System.out.println("W: " + x1 + " H: " + y1); 
     Rectangle r = arg0.getComponent().getBounds(); 
     arg0.getComponent().setBounds(r.x, r.y, x1, y1); 
     widthChanged = false; 
     heightChanged = false; 
     oldWidth = x1; 
     oldHeight = y1; 
    } 
+0

Это нетрадиционный, но в C++ это может быть сделано много приятнее. Вместо того, чтобы ждать полного завершения изменения размера (что вы заметите, что происходит с Java), это можно сделать автоматически. Единственная проблема заключается в преобразовании программы в работу с C++. Однако вы не сможете достичь такого же уровня гладкости. http://stackoverflow.com/questions/2448738/how-to-force-a-window-to-maintain-a-certain-width-height-ratio-when-resized – Obicere

ответ

4

Посмотрите J frame resizing in an aspect ratio

Я думаю, это то, что вам нужно.

@Override 
public void componentResized(ComponentEvent arg0) { 
    int W = 4; 
    int H = 3; 
    Rectangle b = arg0.getComponent().getBounds(); 
    arg0.getComponent().setBounds(b.x, b.y, b.width, b.width*H/W); 

} 
+2

Это прекрасно подходит для того, что он просил, но в случай изменения высоты, это не удастся. Вам нужно будет получить новую ширину, новую высоту и сравнить это соотношение с желаемым соотношением, а затем определить, что изменить – Obicere

1

Попробуйте использовать componentEvent, чтобы сигнализировать, когда размер рамки изменяется. Когда размер кадра изменяется, отслеживать, какое измерение (x или y) было изменено. Используйте метод getSize(), чтобы получить размеры кадра, а затем получите .getWidth() или .getHeight(), чтобы получить новый размер, с которым был скорректирован фрейм. Используйте новый размер измененного измерения для вычисления желаемого размера для другого измерения и установите размер кадра с использованием .setSize (int width, int height).

Это может иметь проблемы, если изменить и ширину и высоту в то же изменение размера, если это так, вы всегда можете базировать высоту от ширины или наоборот

Смежные вопросы