【发布时间】:2021-02-07 17:14:20
【问题描述】:
我正在使用 JFrame 上的 Canvas 开发一个 java gui 应用程序。我尝试在 Jframe 上绘制细长的矩形并注意到它们并不总是显示相同的宽度。
这是我写的一个测试类的结果。左侧使用fillRect()绘制,宽度为1,右侧使用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();
}
}
有人知道它是如何工作的,或者甚至有办法解决这个问题吗?
【问题讨论】:
-
对我来说,两边看起来几乎一样...paste.pics/f94f6b3dcc47c6da97a6cf83e61878a6
-
哦,这很奇怪,可能与我的屏幕分辨率有关?我想我的显示器比 1920 * 1080 更小,这是我在 windows 中的分辨率,但这仍然不能解释 bot 边之间的区别
-
供您参考,您不需要
java.awt.Canvas。您也可以在javax.swing.JPanel上画画。请参阅Performing Custom Painting。也可以看看这篇文章:Mixing Heavyweight and Lightweight Components