调整JFrame大小并保持宽高比?

时间:2013-11-08 20:41:49

标签: java swing resize

我希望用户在保持相同宽高比(宽度>高度的矩形)的同时调整窗口大小。换句话说,如果高度改变,我想强制宽度改变更大的数量,副反之,我希望在调整窗口大小时调整大小,而不是之后。下面的代码对我来说根本不起作用。每当我尝试调整窗口大小时,它只会恢复到原来的大小。即使我拖动调整大小,它也不会改变宽度和高度。任何帮助都将不胜感激,谢谢!

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;
}

2 个答案:

答案 0 :(得分:3)

使用Java(AWT限制)没有简单的方法可以实现这一点。

可能的解决方案:

  • 用户停止调整大小后的正确窗口大小(令用户pov烦恼)
  • 使用不可调整的JWindow / JDialog而不进行任何装饰,并以编程方式重新实现窗口大小调整。使用Swing / AWT可以使用光标形状等。我在一个商业项目中做到了这一点(所以没有来源:-))。唯一的问题是:平台/ jdk版本相当不稳定(尽管近年来AWT / Swing没有那么大的变化)。

在用户拖动/调整大小时操纵窗口大小将无法正常工作

答案 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) {
        }
    }
}

希望有帮助。照原样的代码只会在白色背景上形成一个黑色正方形,但是正方形保持正方形并保持尽可能大。