Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.awt.Graphics.fillRect()行为异常_Java_Applet_Custom Painting - Fatal编程技术网

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