为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕村225694 2023-12-13 14:32:15
我想在 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 像素。我不知道这是怎么发生的,所以我的问题是,有谁知道这可能是什么原因造成的?
查看完整描述

1 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

您可能希望首先快速阅读本文,以便更好地理解为什么当前的方法不起作用(按照您期望的方式)。


我要做的第一件事就是改变你的,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 开始


查看完整回答
反对 回复 2023-12-13
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信