java.awt.Graphics.fillRect()行为异常
下面我有一个简单的方法,可以将一组对象绘制到java.awt.Graphics.fillRect()行为异常,java,applet,custom-painting,Java,Applet,Custom Painting,下面我有一个简单的方法,可以将一组对象绘制到java.awt.applet.applet上。我认为这是非常简单的,但它最终只在applet的左上角将对象绘制为单个像素。其思想是Display类接收一组相当轻量级的对象,这些对象扩展了GameObject,并包含关于它们在屏幕上的位置、大小和外观的信息,然后将它们逐像素地绘制到applet上,根据指定的显示高度和宽度按比例拉伸和定位它们。在测试中,我将显示器的宽度和高度设置为128,并将两个对象传递给显示器,这两个对象都是32像素的正方形(对于ge
java.awt.applet.applet
上。我认为这是非常简单的,但它最终只在applet的左上角将对象绘制为单个像素。其思想是Display类接收一组相当轻量级的对象,这些对象扩展了GameObject
,并包含关于它们在屏幕上的位置、大小和外观的信息,然后将它们逐像素地绘制到applet上,根据指定的显示高度和宽度按比例拉伸和定位它们。在测试中,我将显示器的宽度和高度设置为128,并将两个对象传递给显示器,这两个对象都是32像素的正方形(对于getWidth()
和getHeight()
,都返回32
),对于getX()
和getY()
,一个是红色的,返回24
,另一个是蓝色的,返回getX()
和getY()
的16
。我将Display
放在javax.swing.JFrame
中,并使用java.awt.BorderLayout
确保它填充框架(我使用add(Display,java.awt.BorderLayout.CENTER);
在前面提到的javax.swing.JFrame
中)
据我所知,这应该是一个蓝色的32像素正方形,距离上边缘和左边缘16像素,和一个红色的32像素正方形,要么被另一个的部分遮住,要么被另一个的部分遮住。然而,我得到的只是显示屏左上角的一个红色或蓝色像素。无论窗口大小,这都是一致的
代码
问题:
为什么java.awt.Graphics.fillRect(int x,int y,int width,int height)
只绘制小程序的左上角?
解决方案
解决方案在于这样一行:
g.fillRect((x / this.w) * W, (y / this.h) * H, w/W, h/H);
其中整数计算导致所有值为0。解决办法如下:
g.fillRect((int)(((float)x/(float)this.w) *W),
(int)(((float)y/(float)this.h) *H),
(int)((float)W/(float)w),
(int)((float)H/(float)h));
问题在于
(x / this.w) * W
如果x和这个.w都是整数和x
将x和w中的一个或多个转换为浮动,以强制进行浮动点分割
(int)(((float)x/(float)this.w) *W)
问题在于
(x / this.w) * W
如果x和这个.w都是整数和x
将x和w中的一个或多个转换为浮动,以强制进行浮动点分割
(int)(((float)x/(float)this.w) *W)
+一定是这样的,我以前曾多次处理过这种事情。请确保在对int
s进行除法时检查此项,如w/w
。在将值传递给fillRect之前,请检查值是否正确。检查图形上的夹子。检查是否为正确的窗口创建了正确的图形。请注意,这是我计算缩放高度和宽度的方式><您的解决方案有效:3+1这是必须的,我以前曾多次处理过此类问题。请确保在对int
s进行除法时检查此项,如w/w
。在将值传递给fillRect之前,请检查值是否正确。检查图形上的夹子。检查是否为正确的窗口正确创建了图形。请注意,这是我计算缩放高度和宽度的方式><您的解决方案有效:3