Java 为什么我的“绘制表面”方法不起作用?
因此,有一段时间,重写JComponent的绘制方法给我带来了麻烦,我永远也不知道为什么。我正在从事一个项目,将采取一个黑白图像,并绘制在屏幕上,其中每一个像素的图片是一个50 x 50框在屏幕上很明显,一些绘画将在屏幕外完成,但这是确定的,因为这将是一个二维自上而下的游戏与移动屏幕。不管我做了什么,当它运行时,它从来不会在屏幕上画任何东西,它与我的1:50逻辑无关,因为当我试图让它画一个简单的矩形时,它甚至没有画出来。所以问题一定出在画法上,但我不知道哪里出了问题。我知道这是一个很大的代码,但有人请让我知道什么是错误的? (我知道有很多方法还没有被使用,只是忽略那些) 这是Jframe类: (必须指定要在此类中绘制的黑白图像的路径) 以下是存储所有地图数据的地图类:Java 为什么我的“绘制表面”方法不起作用?,java,swing,paint,Java,Swing,Paint,因此,有一段时间,重写JComponent的绘制方法给我带来了麻烦,我永远也不知道为什么。我正在从事一个项目,将采取一个黑白图像,并绘制在屏幕上,其中每一个像素的图片是一个50 x 50框在屏幕上很明显,一些绘画将在屏幕外完成,但这是确定的,因为这将是一个二维自上而下的游戏与移动屏幕。不管我做了什么,当它运行时,它从来不会在屏幕上画任何东西,它与我的1:50逻辑无关,因为当我试图让它画一个简单的矩形时,它甚至没有画出来。所以问题一定出在画法上,但我不知道哪里出了问题。我知道这是一个很大的代码,但
package Code;
public class Map {
//the Array for all of the codes:
double Tiles[][];
int width;
int height;
//setters and getters for the width and height:
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
//the constructor for the double map:
public Map(long Width, long Height){
Tiles = new double[(int) Width][(int) Height];
}
//this is where the double array is going to be set:
public void setTile(int x, int y, double type){
Tiles[x][y] = type;
}
//this gets the given tile code:
public double getTile(int x, int y){
return Tiles[x][y];
}
}
最后,这里是负责从图像文件加载地图的map loader类:
package Code;
import java.awt.Color;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class MapLoader {
BufferedImage MapImage;
public MapLoader(String MapPath){
//loading the map image from the specified map path:
try {
MapImage = ImageIO.read(new File(MapPath));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Map ConvertMap(){
Map m = new Map(MapImage.getWidth(), MapImage.getHeight());
//now to read the individual pixels of the image and determine the code for the map object:
for(int i = 0; i < MapImage.getWidth(); i++){
for(int n = 0; n < MapImage.getHeight(); n++){
if (MapImage.getRGB(i, n) == Color.BLACK.getRGB()){
//Black = Wall = 1
m.setTile(i, n, 1);
System.out.print("1");
} else {
//else it is nothing so White = Space = 0
m.setTile(i, n, 0);
System.out.print("0");
}
}
System.out.println("");
}
return m;
}
}
包码;
导入java.awt.Color;
导入java.awt.Image;
导入java.awt.image.buffereImage;
导入java.awt.image.ImageObserver;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
公共类映射加载器{
缓冲图像映射图像;
公共映射加载器(字符串映射路径){
//从指定的贴图路径加载贴图图像:
试一试{
MapImage=ImageIO.read(新文件(MapPath));
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共地图转换地图(){
Map m=新地图(MapImage.getWidth(),MapImage.getHeight());
//现在读取图像的各个像素并确定贴图对象的代码:
对于(int i=0;i
非常感谢所有帮助我的人,这已经困扰了我好几天了,我已经没有主意了
这里还有一个我一直在使用的示例文件:
您的绘制方法有效,但没有人可以看到PaintSurface对象。你有:
PS = new PaintSurface();
TitlePanel = new JPanel();
TitlePanel.add(PS, BorderLayout.CENTER);
您正在将PS对象添加到BorderLayout.CENTER位置,但TitlePanel不使用BorderLayout--它使用默认的FlowLayout。现在,PaintSurface的首选尺寸为0,0,由于TitlePanel使用FlowLayout,PS将非常小
解决方案:将TitlePanel的布局设置为BorderLayout
PS = new PaintSurface();
TitlePanel = new JPanel(new BorderLayout());
TitlePanel.add(PS, BorderLayout.CENTER);
这将使PaintSurface实例填充标题面板
此外,根据我的评论:
- 始终替代绘制组件,而不是绘制。任何像样的图形教程都会告诉你这一点李>
- 如果要在覆盖范围内覆盖super的绘制方法,请始终调用super.paintComponent(…)李>
- 以这样的方式创建代码,使每个类都可以独立测试和调试,使用小型模拟类来帮助您完成这一任务李>
- 通过这种方式,如果您遇到bug,您可以创建并发布最小、完整且可验证的示例,供我们测试,而不是要求我们检查整个大型程序
- 请注意,您从不调用
DrawStartInterface(…)
- 请学习并遵循Java命名约定,因为这样做将帮助其他人更好地理解您的代码。字段和方法名称均应以小写字母开头,而类和接口名称应以大写字母开头
DrawStartInterface(…)
!附带建议:请学习并遵循Java命名约定,因为这样做有助于其他人更好地理解您的代码。作为参考,Java命名约定:另外,不要将您的类命名为“Window”,因为您最终会与Java.AWT.Window类混淆,后者是JFrame的超类。因此,尽量不要将任何类命名为与现有java类相同的名称。
PS = new PaintSurface();
TitlePanel = new JPanel();
TitlePanel.add(PS, BorderLayout.CENTER);
PS = new PaintSurface();
TitlePanel = new JPanel(new BorderLayout());
TitlePanel.add(PS, BorderLayout.CENTER);