繁体   English   中英

Java Swing window 大小不匹配 AWT ZFCC790C72A86190DE1B549D0DDCF

[英]Java Swing window size does not match AWT canvas result

我想在 JPanel 中绘制一个宽度为原始 window 的 80% 宽度和 80% 高度的矩形。

这是我的驱动程序 class

public class driver {
    public static void main(String[] args) {
        System.out.println("test");
        Window myWindow = new Window();
        myWindow.add(new GraphPanel());
        myWindow.settings();
    }
}

这是我的JPanel:

import javax.swing.*;

public class Window extends JFrame {

    private static final int width = 1100;
    private static final int height = 600;

    public void settings(){
        setSize(width,height);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    public static int[] getWindowSize(){
        int[] output = new int[]{width, height};
        return output;
    }
}

和矩形 canvas:

import java.awt.*;

public class GraphPanel extends Canvas {
    public void paint(Graphics g){
        setBackground(Color.WHITE);
        setForeground(Color.DARK_GRAY);

        int[] windowSize = Window.getWindowSize();

        //Not working as intented
        g.drawRect(windowSize[0]/10, windowSize[1]/10, 8*windowSize[0]/10, 8*windowSize[1]/10);
    }
}

这是结果,我无法发布图片,所以这是一个链接https://i.imgur.com/6D1gEF7.png

如您所见,这显然不是居中的,高度偏离了大约 30 像素,宽度大约偏离了 20。我不知道这是怎么发生的,所以我的问题是,有谁知道可能是什么原因造成的?

您可能希望先快速阅读内容,以更好地了解您当前的方法为何行不通(如您所期望的那样)。

我要做的第一件事是更改您的GraphPanel ,以便它定义它的preferredSize ,独立于 window。 通过这种方式,您可以将控制权交给布局管理系统。

接下来,我将使用组件的实际物理尺寸来进行计算

int width = (int) (getWidth() * 0.8);
int height = (int) (getHeight() * 0.8);

我还建议将setBackgroundsetBackground移出paint方法。 这将导致一个新的痛苦循环发生,并将把事情弄得一团糟。

public class GraphPanel extends Canvas {

    private static final int PREF_WIDTH = 1100;
    private static final int PREF_HEIGHT = 600;

    public GraphPanel() {
        setBackground(Color.WHITE);
        setBackground(Color.DARK_GRAY);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(PREF_WIDTH, PREF_HEIGHT);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);

        int width = (int) (getWidth() * 0.8);
        int height = (int) (getHeight() * 0.8);

        int x = (getWidth() - width) / 2;
        int y = (getHeight() - height) / 2;

        //Not working as intented
        g.drawRect(x, y, width, height);
    }
}

然后我会更新你的Window class 所以它使用pack而不是setSize 这将“打包” window 围绕内容,考虑到框架装饰。

public class Window extends JFrame {

    public void settings() {
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

虽然,我会质疑从JFrame扩展的点,但我正在讨论话题。

说到这一点,除非您打算使用需要完全控制绘画子系统的高性能图形,否则我建议您从基于 Swing 的组件甚至 JavaFX 开始

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM