gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:29:23 25 4
gpt4 key购买 nike

当我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com