一次水平和垂直调整窗口(主框架)的大小

时间:2013-12-13 14:29:53

标签: java swing

正如您在Java Swing中所了解的那样,您可以通过拖动鼠标,垂直,水平或两者来重新调整帧的大小,但我喜欢只用鼠标拖动来一次性重新调整垂直和水平尺寸,这也适用于用户在所有位置移动鼠标。我想要的一个例子是Windows中的单人纸牌游戏,正如你在游戏中所知,当用户拖动鼠标重新调整窗口大小时,框架将在垂直和水平位置按比例重新调整大小。

Java Swing中的主框架(窗口)是否可能?

2 个答案:

答案 0 :(得分:1)

  

Java Swing中的主框架(窗口)是否可能?

不是没有一些JNI / JNA。

答案 1 :(得分:0)

一个黑客就是这样的。使用ComponentListener并覆盖其componentResized()。每次调整框架大小时,它都会将大小设置为相对宽度和高度。不确定这是否是您正在寻找的所需效果,但您可以测试它。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

public class SampleFrame {
    public Dimension lastSize = new Dimension(400,300);

    public JFrame frame;
    public SampleFrame() {
        frame = new JFrame("Sample Frame");
        frame.setSize(lastSize);
        frame.setLocationRelativeTo(null);

        frame.addComponentListener(new ComponentListener() {
            public void componentResized(ComponentEvent e) {
                Dimension currentFrameSize = frame.getSize();
                int widthDelta = Math.abs(lastSize.width - currentFrameSize.width);
                int heightDelta = Math.abs(lastSize.height - currentFrameSize.height);

                if(heightDelta > widthDelta) {
                    double scaleRatio = currentFrameSize.getHeight() / lastSize.height;
                    currentFrameSize.width = (int) (lastSize.width * scaleRatio);
                } else {
                    double scaleRatio = currentFrameSize.getWidth() / lastSize.width;
                    currentFrameSize.height = (int) (lastSize.height * scaleRatio);
                }
                frame.setSize(currentFrameSize);
                lastSize = currentFrameSize;
                frame.setLocationRelativeTo(null);
            }

            public void componentMoved(ComponentEvent e) {
            }
            public void componentShown(ComponentEvent e) {
            }
            public void componentHidden(ComponentEvent e) {
            }
        });
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new SampleFrame();
    }
}