java - Graphics/JPanel 尺寸不是以像素为单位测量的吗?

标签 java swing jpanel

当我在 JFrame 内的 JPanel 上绘制 [drawRect(x, y, width, height)] 一个矩形时,其宽度为500,它实际上比我屏幕上的 500 像素宽。这是如何衡量的?

当我在 JPanel 上绘制矩形以及 JFrame 的大小时,我认识到,对于 JFrame 和 JPanel 来说,500“宽度”是不同的东西。 创建的宽度为 1920 像素的 JFrame 正好是 1920 像素宽,意味着与我的屏幕 (1920x1080) 一样宽。 如果我在 JPanel 上(位于 JFrame 内部)绘制一个宽度为 1920 的矩形,它会将我的屏幕延伸 385 像素。分别:一个与我的屏幕一样宽的绘制矩形需要1535的宽度。

import javax.swing.*;
import java.awt.*

public class Main {

    public static void main(String[] args){

        JFrame window = new JFrame();
        window.setSize(1920,1080);     //Window as wide as the screen
        window.add(new Canvas());
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);

    }

}

public class Canvas extends JPanel {

    @Override
    protected void paintComponent(Graphics g){

        super.paintComponent(g);
        g.drawRect(0, 0, 1920, 500); //Paints a rectangle on the JPanel

    }
}

打开的窗口与我的屏幕一样宽,但里面的矩形扩展了它。 如果我将矩形的宽度更改为 1535 [drawRect(0, 0, 1535, 500)],它与 JFrame/屏幕一样宽。这是为什么?

编辑:由于 Windows 10 Frame 侧面没有装饰,只有顶部的标准菜单栏,我认为这不是问题(据我了解装饰)。

最佳答案

简短的回答:是的。

解释:让我们看得更深入!

在 MacOS 上运行 Java Swing(使用 Metal LAF 测试),JFrame 的左侧和右侧插入为零。这类似于 Windows 10 上某些主题的渲染。我在下面包含了代码;内容 Pane 和面板的填充矩形之间的间隙应保持 8 像素。当程序运行时,调整它的大小,然后自己检查。如果这不是您遇到的行为,请随时发表评论。

public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        final String name;
        name = javax.swing.plaf.metal.MetalLookAndFeel.class.getName();
        try {
            UIManager.setLookAndFeel(name);
        }
        catch (Throwable e) {
            e.printStackTrace();
        }

        createAndShowWindow();
    });
}

private static void createAndShowWindow() {
    final int width = 1920;
    final int height = 800;
    final int padding = 8;

    JFrame window = new JFrame();
    window.setTitle("Hello World.");
    window.setPreferredSize(new Dimension(width, height));
    window.setSize(width, height);     //Window as wide as the screen
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Canvas canvas = new Canvas(padding);
    window.add(canvas, BorderLayout.CENTER);

    window.pack();
    window.setVisible(true);

    System.out.println("w: " + window.getSize());
    System.out.println("c: " + window.getContentPane().getSize());
    System.out.println("p: " + canvas.getSize());
    System.out.println("i: " + window.getInsets());
}

public static class Canvas extends JPanel {

    private final int padding;

    public Canvas(int padding) {
        this.padding = padding;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(new Color(180, 120, 16));
        //Paints a rectangle on the JPanel
        int x = padding;
        int y = padding;
        int w = getWidth() - 2 * padding;
        int h = getHeight() - 2 * padding;
        g.fillRect(x, y, w, h);
    }
}

关于java - Graphics/JPanel 尺寸不是以像素为单位测量的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58102792/

相关文章:

java - 带有线条和区域的程序地形纹理

java - 具有特殊字符时未解析 XML 文件节点属性

java - 让 JLayeredPane 的子级填充容器的可用空间

Java - 使用 Jbutton 监听器获取 JRadioButton cmd

java - JPanel 绘图不工作

java - 向 JPanel 添加其他 JPanel

java - 缺少 `server' JVM (Java\jre7\bin\server\jvm.dll。)

java - 定期检查超时条件

java - 表模型更新 + fireTableDataChanged() 打乱表选择

java - Intellij, "contentPane cannot be set to null"使用 Swing 设计器