簡體   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