Java 如何在构建渲染引擎时初始化图形g

Java 如何在构建渲染引擎时初始化图形g,java,swing,rendering-engine,Java,Swing,Rendering Engine,因此,我的一个朋友构建了一个渲染引擎,其中几乎包含了graphics拥有的方法。这样,您只需调用RenderingEngines类的方法即可将内容呈现到屏幕上。不去寻找和尝试学习而不是作弊,我试图根据我的知识复制它。不过我遇到了一个问题。我所有的方法都可以工作,只是当RenderingEngine类在我的游戏类中初始化时,在尝试获取JPanel的图形后,RenderingEngine类中的图形g为null。我不知道我是否不明白这是如何工作的,并且希望得到一个解释,我将把代码放在下面 渲染类如下:

因此,我的一个朋友构建了一个
渲染引擎
,其中几乎包含了graphics拥有的方法。这样,您只需调用
RenderingEngines
类的方法即可将内容呈现到屏幕上。不去寻找和尝试学习而不是作弊,我试图根据我的知识复制它。不过我遇到了一个问题。我所有的方法都可以工作,只是当RenderingEngine类在我的游戏类中初始化时,在尝试获取JPanel的图形后,RenderingEngine类中的图形g为null。我不知道我是否不明白这是如何工作的,并且希望得到一个解释,我将把代码放在下面

渲染类如下:

package game.Main;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;


public class RenderingEngine extends JPanel
{
    private Graphics g;
    public RenderingEngine()
    {
        g = this.getGraphics();
    }

    public void setColor(Color color)
    {
        g.setColor(color);
    }

    public void fillRect(Rectangle rect)
    {
        g.fillRect(rect.x, rect.y, rect.width, rect.height);
    }

    public void drawRect(Rectangle rect)
    {
        g.drawRect(rect.x, rect.y, rect.width, rect.height);
    }

    public void setStringFont(Font font)
    {
        g.setFont(font);
    }

    public void drawString(String string, int x, int y)
    {
        g.drawString(string, x, y);
    }

    public void drawImage(BufferedImage image, Rectangle rect)
    {
        g.drawImage(image, rect.x, rect.y, rect.width, rect.height, this);
    }

    public void clear(Rectangle rect)
    {
        g.clearRect(rect.x, rect.y, rect.width, rect.height);
    }

    public int widthofString(String string, Font font)
    {
        String text = string;
        AffineTransform affinetransform = new AffineTransform();
        FontRenderContext frc = new FontRenderContext(affinetransform,true,true);
        Font f1 = font;
        int textwidth = (int)(font.getStringBounds(text, frc).getWidth());
        return textwidth;
        //int textheight = (int)(font.getStringBounds(text, frc).getHeight());
    }

    public int heightofString(String string, Font font)
    {
        String text = string;
        AffineTransform affinetransform = new AffineTransform();
        FontRenderContext frc = new FontRenderContext(affinetransform,true,true);
        Font f1 = font;
        //int textwidth = (int)(font.getStringBounds(text, frc).getWidth());
        int textheight = (int)(font.getStringBounds(text, frc).getHeight());
        return textheight;
    }

    public void paint()
    {

    }
}
其中我在游戏类中初始化渲染引擎:

private void Load()
{
    frame = new JFrame();
    frame.setSize(800,600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    render = new RenderingEngine();
    frame.add(render);
    LoadContent();
    gameloop = new GameLoop();
    gameloop.Run();
}

<> P>您可能会认为,当我回答“如何初始化一个图形G”的问题时,用<…/P> > >代码> 一点也不! 您可能想看看这篇文章,或者关于这篇文章(不幸的是,在从Sun到Oracle的转换过程中,这篇文章有点混乱,但仍然包含比另一篇文章更有价值和更详细的信息)

可以说,JPanel的
图形
是由操作系统管理的,它表示屏幕上可能进行绘制的区域。当面板尚不可见时,调用
getGraphics()
返回的
Graphics
可能为
null
。在其他情况下,它也可能是
null
。特别是,当从非事件分派线程的线程访问它时

一般来说,根据经验法则:

切勿对组件调用
getGraphics

对于这种“RenderingEngine”类,一种可能的解决方案是使用
BuffereImage
Graphics
对象。这不应该太复杂,但是你必须考虑以下几个方面:

  • 什么时候初始化映像
  • 图形何时初始化
  • 什么时候处理图形
  • 调整面板大小时会发生什么情况

但是,使用此方法,至少可以创建适合预期用途的“渲染引擎”。

好的,谢谢,我将尝试使用BuffereImage,但对于可见性问题,它不应该是可见的,因为它是由jframe添加的,哪个帧设置为可见?再次,您可能永远无法确定
getGraphics
是否返回有效的
Graphics
对象。顺便说一句:至少在发布的代码中,框架是不可见的,并且在任何情况下,必须在将
渲染引擎
类的构造函数添加到框架之前调用它-并且在构造函数中,您试图获取
图形
对象。所以这基本上不能工作…好的,谢谢你现在尝试用BuffereImage的方式,我没有空值,但仍然没有显示在屏幕上。在问另一个问题之前,我会调查一下,但谢谢你的帮助!:)@Kunarklive您必须通过覆盖面板的
paintComponent
方法来绘制图像。必须使用
g.drawImage(image,0,0,null)
“您必须绘制图像…”或简单地将其显示在标签中,将图像绘制到在
paintComponent
方法中接收的
图形中。