我希望用户在保持相同宽高比(宽度>高度的矩形)的同时调整窗口大小。换句话说,如果高度改变,我想强制宽度改变更大的数量,副反之,我希望在调整窗口大小时调整大小,而不是之后。下面的代码对我来说根本不起作用。每当我尝试调整窗口大小时,它只会恢复到原来的大小。即使我拖动调整大小,它也不会改变宽度和高度。任何帮助都将不胜感激,谢谢!
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 :(得分:3)
使用Java(AWT限制)没有简单的方法可以实现这一点。
可能的解决方案:
在用户拖动/调整大小时操纵窗口大小将无法正常工作
答案 1 :(得分:0)
我想出了一种方法来保持JPanel的纵横比作为学校项目的平方。它在不同的地方花费了一些不同的元素,因此我希望我能提供足够的信息来帮助您使用所需的纵横比将方法实现到自己的项目中。我能够将其简化为两个java文件。不确定如何进一步压缩它
第一个:AspectRatio.java
import java.awt.Color;
import javax.swing.JFrame;
public class AspectRatio {
public static void main(String[] args) {
JFrame frame = new JFrame("Stay a square");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.WHITE);
frame.getContentPane().add(new SquarePanel());
frame.pack();
frame.setVisible(true);
}
}
第二个有它的实质:SquarePanel.java
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class SquarePanel extends JPanel {
//Fields
private JPanel square;
private int panelHeight;
private int panelWidth;
//Constructor
public SquarePanel() {
square = new JPanel();
square.setBackground(Color.BLACK);
square.setPreferredSize(new Dimension(800,800));
this.addComponentListener(new FrameSizeListener());
this.add(square);
}
//resizing method
public void resizeSquare() {
panelHeight = super.getHeight();
panelWidth = super.getWidth();
if(panelHeight>(panelWidth)) {
square.setPreferredSize(new Dimension(panelWidth,panelWidth));
}
else if (panelHeight<(panelWidth)) {
square.setPreferredSize(new Dimension(panelHeight,panelHeight));
}
}
//Window resizing listener
private class FrameSizeListener implements ComponentListener{
public void componentResized(ComponentEvent e) {
resizeSquare();
revalidate();
}
public void componentMoved(ComponentEvent e) {
}
public void componentShown(ComponentEvent e) {
}
public void componentHidden(ComponentEvent e) {
}
}
}
希望有帮助。照原样的代码只会在白色背景上形成一个黑色正方形,但是正方形保持正方形并保持尽可能大。