Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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 为什么我的“绘制表面”方法不起作用?_Java_Swing_Paint - Fatal编程技术网

Java 为什么我的“绘制表面”方法不起作用?

Java 为什么我的“绘制表面”方法不起作用?,java,swing,paint,Java,Swing,Paint,因此,有一段时间,重写JComponent的绘制方法给我带来了麻烦,我永远也不知道为什么。我正在从事一个项目,将采取一个黑白图像,并绘制在屏幕上,其中每一个像素的图片是一个50 x 50框在屏幕上很明显,一些绘画将在屏幕外完成,但这是确定的,因为这将是一个二维自上而下的游戏与移动屏幕。不管我做了什么,当它运行时,它从来不会在屏幕上画任何东西,它与我的1:50逻辑无关,因为当我试图让它画一个简单的矩形时,它甚至没有画出来。所以问题一定出在画法上,但我不知道哪里出了问题。我知道这是一个很大的代码,但

因此,有一段时间,重写JComponent的绘制方法给我带来了麻烦,我永远也不知道为什么。我正在从事一个项目,将采取一个黑白图像,并绘制在屏幕上,其中每一个像素的图片是一个50 x 50框在屏幕上很明显,一些绘画将在屏幕外完成,但这是确定的,因为这将是一个二维自上而下的游戏与移动屏幕。不管我做了什么,当它运行时,它从来不会在屏幕上画任何东西,它与我的1:50逻辑无关,因为当我试图让它画一个简单的矩形时,它甚至没有画出来。所以问题一定出在画法上,但我不知道哪里出了问题。我知道这是一个很大的代码,但有人请让我知道什么是错误的? (我知道有很多方法还没有被使用,只是忽略那些)

这是Jframe类:

(必须指定要在此类中绘制的黑白图像的路径)

以下是存储所有地图数据的地图类:

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命名约定,因为这样做将帮助其他人更好地理解您的代码。字段和方法名称均应以小写字母开头,而类和接口名称应以大写字母开头

1)始终覆盖油漆组件,而不是油漆。任何像样的图形教程都会告诉你这一点。2) 如果要覆盖super的绘制方法,请始终在覆盖中调用super.paintComponent(…)
。3) 以这样的方式创建代码,使每个类都可以独立地进行测试和调试,使用小型模拟类来帮助您完成这项工作。4) 这样,如果您遇到错误,您可以创建并发布您的代码供我们测试,而不是要求我们检查整个大型程序。请注意,您从不调用
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);