什么叫paintComponent()?

黑暗之物

我正在尝试从子图形表中绘制子图形。

我有以下课程

public class GTComponent extends JComponent {

    Graphics2D g2;

    @Override
    public void paintComponent(Graphics g){
        g2 = (Graphics2D)g;
    }

    public void drawSpriteFrame(Image source, int x, int y, int frame) {
        int frameX = (frame % 12) * 32;
        int frameY = (frame / 12) * 32;
        g2.drawImage(source, x, y, x + 32, y + 32,
                frameX, frameY, frameX + 32, frameY + 32, this);
    }
}

这样就在主类中将其创建为对象

    JFrame f = new JFrame();
    GTComponent img = new GTComponent();

    f.add(img);

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize((int)(i.length * 8.1), (int)(i[0].length * 8.5));
    f.setVisible(true);
    f.setLocationRelativeTo(null);

    BufferedImage test = null;
    try {
        test = ImageIO.read(new File( /*Image File path*/));
    }
    catch (IOException e) {
        System.out.println("error");
        System.exit(0);
    }

    img.drawSpriteFrame(test, (u * 32 + 1), (z * 32 + 1), c);

我面临的问题是抛出以下错误

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

经过几次调试后,在paintComponent处设置断点drawSpriteFrame,我发现该drawSpriteFrame方法在该paintComponent方法之前被调用,这意味着g2 = null导致抛出该错误。

这里的问题是什么触发允许我初始化g2变量的paintComponent方法?

戴维·摩尔

paintComponent()从事件调度线程自动调用的如果希望将自定义组件作为普通的Swing绘画过程的一部分进行绘画,则应重写paintComponent()以调用您的drawSpriteFrame()方法,而不是drawSpriteFrame()直接调用

如果要自己控制绘图操作,则需要使用“全屏独占模式”教程中所述的“活动渲染” 请注意,此处描述的技术也适用于窗口应用程序。基本上,您需要向窗口询问Graphics实例(而不是等待实例传递到实例paintComponent()然后再绘制实例)

使用双缓冲的基本示例:

// Initial setup
Frame mainFrame = new Frame();
mainFrame.setVisible(true); // you'll also want to set size, location, etc.
mainFrame.createBufferStrategy(2);
BufferStrategy bufferStrategy = mainFrame.getBufferStrategy();

//.... 

// Inside your draw loop (call once for each frame)
Graphics2D g2 = (Graphics2D) bufferStrategy.getDrawGraphics();
g2.drawImage(...) // etc.
g2.dispose();
bufferStrategy.show();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么叫“-”?

来自分类Dev

什么叫int()?

来自分类Dev

为什么叫iota?

来自分类Dev

为什么叫ROM?

来自分类Dev

Java主类。什么叫?

来自分类Dev

什么叫最优化算法?

来自分类Dev

什么时候叫代表?

来自分类Dev

为什么叫响应文件

来自分类Dev

什么是__方法__,为什么叫__getattr__?

来自分类Dev

viewdidAppear:为什么我必须叫超级?

来自分类Dev

Android:为什么这样叫“无效”区域?

来自分类Dev

这是什么补偿。科学 概率。叫?

来自分类Dev

为什么Destructor叫Three Time?

来自分类Dev

什么叫匿名内部类内部的方法?

来自分类Dev

什么叫HelloWorldAnonymousClasses中的greet()方法?

来自分类Dev

为什么叫d'tor,尽管不叫?

来自分类Dev

为什么叫 Hirsute 而不是 Hairy?

来自分类Dev

java什么更重:Canvas或paintComponent()?

来自分类Dev

什么是JPanel / Graphics方法paintComponent?

来自分类Dev

什么是JPanel / Graphics方法paintComponent?

来自分类Dev

为什么DrRacket似乎将其识别为尾叫?

来自分类Dev

错误R6010。为什么叫它?

来自分类Dev

为什么我可以叫.between?Fixnum方法?

来自分类Dev

我叫它时下面方法的参数是什么

来自分类Dev

错误R6010。为什么叫它?

来自分类Dev

为什么asp.net MVC叫轻量级?

来自分类Dev

什么叫 URL 到文件夹,而不是特定文件?

来自分类Dev

super.paintComponent(g)有什么作用?

来自分类Dev

有什么办法可以延迟PaintComponent吗?