猿问

Java Swing 窗口大小与 AWT 画布结果不匹配

我想在 JPanel 中绘制一个具有原始窗口 80% 宽度和 80% 高度的矩形。


这是我的驾驶员课程


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;

    }

}

和矩形画布:


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.stack.imgur.com/VlQIk.png


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


慕村225694
浏览 117回答 1
1回答

繁花不似锦

您可能希望首先快速阅读本文,以便更好地理解为什么当前的方法不起作用(按照您期望的方式)。我要做的第一件事就是改变你的,GraphPanel让它定义它preferredSize,独立于窗口。通过这种方式,您可以将控制权交给布局管理系统。接下来,我将使用组件的实际物理尺寸来进行计算int width = (int) (getWidth() * 0.8);int height = (int) (getHeight() * 0.8);我还建议将setBackground和setBackground移出该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课程,以便它使用pack而不是setSize. 这会将窗口“包装”在内容周围,同时考虑到框架装饰。public class Window extends JFrame {    public void settings() {        pack();        setLocationRelativeTo(null);        setVisible(true);        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    }}虽然,我质疑从 延伸的意义JFrame,但我已经进入主题了。说到这里,除非您想要高性能图形,需要您完全控制绘画子系统,否则我建议从基于 Swing 的组件甚至 JavaFX 开始
随时随地看视频慕课网APP

相关分类

Java
我要回答