亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號