java - 为什么宽度为1的fillRect与drawLine不同
问题描述
我正在使用 JFrame 上的 Canvas 开发一个 java gui 应用程序。我试图在 Jframe 上绘制细矩形并注意到它们并不总是显示相同的宽度。
这是我写的一个测试类的结果。左侧使用宽度为 1 的 fillRect() 绘制,右侧使用 drawLine 绘制。
这是我的测试类的代码。
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferStrategy;
public class test {
public static void main(String[]args){
new test();
}
public test(){
JWindow frame = new JWindow();
frame.setSize(500,500);
frame.setLocation(200,200);
Canvas c = new Canvas();
frame.add(c);
frame.setVisible(true);
new Thread(() -> {
while(true) {
BufferStrategy bs = c.getBufferStrategy();
if (bs == null) {
c.createBufferStrategy(2);
bs = c.getBufferStrategy();
}
Graphics g = bs.getDrawGraphics();
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.black);
for(int i = 0; i < 50; i++){
if(i % 4 == 0){
g2.fillRect(20 + i, 50, 1, 100);
}
else if(i % 4 == 1){
g2.fillRect(20 + i, 150, 1, 100);
}
else if(i % 4 == 2){
g2.fillRect(20 + i, 250, 1, 100);
}
else{
g2.fillRect(20 + i, 350, 1, 100);
}
}
for(int i = 0; i < 50; i++){
if(i % 4 == 0){
g2.drawLine(100 + i, 50, 100 + i, 150);
}
else if(i % 4 == 1){
g2.drawLine(100 + i, 150, 100 + i, 250);
}
else if(i % 4 == 2){
g2.drawLine(100 + i, 250, 100 + i, 350);
}
else{
g2.drawLine(100 + i, 350, 100 + i, 450);
}
}
g.dispose();
bs.show();
}
}).start();
}
}
有人知道它是如何工作的,或者甚至是解决这个问题的方法吗?
解决方案
如果仔细观察,您会注意到第四组线向右移动了 2 个像素。
我认为您正在进行125% 的 UI 缩放,因此每 4 个逻辑像素就有 5 个物理像素。这可以通过发布图像中的线条为 125 像素高这一事实得到证实,即使代码要求线条为 100 像素长。
这意味着当您使用x + 3
(logically)绘制时,它实际上映射到x + 4
(physically on the monitor)。该drawLine()
方法正确地移动了 4 个像素而不是 3 个像素,并且正确地绘制了一条 1 像素宽的线。
drawRect()
然而,将分别计算要填充的框的左侧(包括)和右侧(不包括) ,因此对于第三组框,右侧是左侧右侧的 2 个像素。然后它填充 2 像素宽的框。
我们大多数人没有 UI Scaling,所以我们不会看到您遇到的问题。
推荐阅读
- python - python 正则表达式帮助未知,直到**自我解决**
- python - 无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量
- session - ASP.Net Core 2.1 API JWT 无 cookie 会话?
- terminal - 获取 curses 应用程序的屏幕截图
- laravel - 如何暂停或延迟 Horizon 队列上的所有作业
- windows - awstats 不显示来自 IIS 8.5 的统计信息
- html - 同一元素中拆分文本的背景颜色
- selenium - Protractor 如何在 Jenkins 构建中启动 Selenium 服务器
- c++ - 将 python 和 numpy 嵌入到 C++ 时出现 import_array() 错误
- r - 从 R 脚本到 Power Bi - 如何使用 setdiff