Java 调整JFrame的大小并保持纵横比?

Java 调整JFrame的大小并保持纵横比?,java,swing,resize,Java,Swing,Resize,我希望用户调整窗口大小,同时保持相同的纵横比(宽度>高度的矩形。换句话说,如果高度发生变化,我想强制宽度发生更大的变化,反之亦然。最好是在调整窗口大小时,而不是之后进行调整。下面的代码对我根本不起作用。每当我尝试调整窗口大小时,它都会恢复到原来的大小ginal大小。即使我拖动来调整大小,宽度和高度都不会改变。任何帮助都将不胜感激,谢谢 public void componentResized(ComponentEvent arg0) { int setHeight = arg0.getC

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

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

使用Java(AWT限制)实现这一点并不容易

可能的解决办法:

  • 用户停止调整大小后的窗口大小正确(用户pov的干扰)
  • 在没有任何修饰的情况下使用不可压缩的JWindow/JDialog,并以编程方式重新实现窗口大小调整。Swing/AWT可以使用光标形状等。我在一个商业项目中这样做过(因此没有来源:-)。唯一的问题是:对于平台/jdk版本,它非常不稳定(尽管近年来AWT/Swing的变化不大)

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

使用Java(AWT限制)无法轻松实现这一点

可能的解决办法:

  • 用户停止调整大小后的窗口大小正确(用户pov的干扰)
  • 在没有任何修饰的情况下使用不可压缩的JWindow/JDialog,并以编程方式重新实现窗口大小调整。Swing/AWT可以使用光标形状等。我在一个商业项目中这样做过(因此没有来源:-)。唯一的问题是:对于平台/jdk版本,它非常不稳定(尽管近年来AWT/Swing的变化不大)

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

我找到了一种方法,可以将JPanel的纵横比保持为学校项目的正方形。它在不同的位置使用了一些不同的元素,因此我希望我能提供足够的信息,以帮助您在自己的项目中使用任何aspec实现该方法你想要的比率。我可以把它归结为两个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) {
        }
    }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.event.ComponentEvent;
导入java.awt.event.ComponentListener;
导入javax.swing.JPanel;
@抑制警告(“串行”)
公共类SquarePanel扩展了JPanel{
//田地
私人吉帕内尔广场;
私人内板高度;
专用内板宽度;
//建造师
公共事务委员会(){
square=新的JPanel();
方形。立根背景(颜色。黑色);
方形。设置首选尺寸(新尺寸(800800));
this.addComponentListener(新的FrameSizeListener());
这个。加上(正方形);
}
//调整大小方法
公共void resizeSquare(){
panelHeight=super.getHeight();
panelWidth=super.getWidth();
如果(面板高度>(面板宽度)){
square.setPreferredSize(新尺寸(面板宽度、面板宽度));
}

否则如果(panelHeight我找到了一种方法,可以将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) {
        }
    }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.event.ComponentEvent;
导入java.awt.event.ComponentListener;
导入javax.swing.JPanel;
@抑制警告(“串行”)
公共类SquarePanel扩展了JPanel{
//田地
私人吉帕内尔广场;
私人内板高度;
专用内板宽度;
//建造师
公共事务委员会(){
square=新的JPanel();
方形。立根背景(颜色。黑色);
方形。设置首选尺寸(新尺寸(800800));
this.addComponentListener(新的FrameSizeListener());
这个。加上(正方形);
}
//调整大小方法
公共void resizeSquare(){
panelHeight=super.getHeight();
panelWidth=super.getWidth();
如果(面板高度>(面板宽度)){
square.setPreferredSize(新尺寸(面板宽度、面板宽度));
}

否则如果(PanelHeight组件可能由布局管理器控制……如果您可以提供重现问题的解决方案,则更容易找到解决方案。一个简单的解决方案可能是编写一个布局管理器,其唯一责任是根据提供的比率调整子组件的大小,以便子组件始终适合在父容器内,但将正确保持纵横比组件可能在布局管理器的控制下…如果您可以提供一个复制问题的方法,则更容易找到解决方案。一个简单的解决方案可能是编写一个布局管理器,其唯一责任是根据提供的比率使子组件始终适合父容器,但将正确保持纵横比