【问题标题】:Setting up a JPanel in a JFrame?在 JFrame 中设置 JPanel?
【发布时间】:2011-11-30 01:51:01
【问题描述】:

所以,我一直在努力重做我的代码,以便绘画全部在 JPanel 而不是 JFrame 中完成,这样我就可以做一些非常需要的图像缓冲。

我搜索了 StackOverflow,并且用 Google 搜索了我的手指,我认为我设置正确,但它无法正常工作。我只是在终端中看到一个空白屏幕和一些错误脚本。任何帮助表示赞赏。这是代码

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;

public class RacerDoom extends JFrame {
    private JPanel panel;
    final int WIDTH = 900, HEIGHT = 640;
    int counter = 0;
    Rectangle left = new Rectangle(0,0,WIDTH/9,HEIGHT);
    Rectangle right = new Rectangle((WIDTH/9)*8,0,WIDTH/9,HEIGHT);
    Rectangle top = new Rectangle(0,0,WIDTH,HEIGHT/9);
    Rectangle bottom = new Rectangle(0,(HEIGHT/9)*8,WIDTH,HEIGHT);
    Rectangle center = new Rectangle((int)((WIDTH/9)*2.5),(int)((HEIGHT/9)*2.5),(int)((WIDTH/9)*4),(HEIGHT/9)*4);
    Rectangle p1 = new Rectangle(WIDTH/9,HEIGHT/2,WIDTH/30,WIDTH/30);
    Rectangle finishtop = new Rectangle(WIDTH/9,(HEIGHT/2)-HEIGHT/9,(int)((WIDTH/9)*1.5),HEIGHT/70);
    //Starting lines
    Rectangle startO = new Rectangle(WIDTH/9,HEIGHT/2,(int)((WIDTH/9)*1.5)/2,HEIGHT/140);
    public RacerDoom() {
        //create JFrame
        super("Racer Doom Squared");
        setSize(WIDTH,HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        getContentPane().add(panel);

        panel = new MainPanel();
        panel.setBounds(0,0,WIDTH,HEIGHT);

        this.getContentPane().add(panel);
        //set up Game countdown timer
        final Timer timer=new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(counter>=10) {
                    ((Timer)e.getSource()).stop();
                }
                else{
                   counter++;
                   }
                System.out.println(counter);
            }
        });

        //start timer
        timer.start();
    }
    private class MainPanel extends JPanel {
        public MainPanel() {
            super();
        }
    //draw graphics
        @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillRect(0,0,WIDTH,HEIGHT);
        //boundaries
        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(left.x,left.y,left.width,left.height);
        g.fillRect(right.x,right.y,right.width,right.height);
        g.fillRect(top.x,top.y,top.width,top.height);
        g.fillRect(bottom.x,bottom.y,bottom.width,bottom.height);
        g.fillRect(center.x,center.y,center.width,center.height);
        //start line
        g.setColor(Color.WHITE);
        g.fillRect(startO.x,startO.y,startO.width,startO.height);
        //finish line
        g.setColor(Color.CYAN);
        g.fillRect(finishtop.x,finishtop.y,finishtop.width,finishtop.height);
        //p1
        g.setColor(Color.BLUE);
        g.fill3DRect(p1.x,p1.y,p1.width,p1.height,true);
        //HUD
        g.setColor(Color.WHITE);
        Font f = new Font("Monospaced", Font.BOLD, 24);
        g.setFont(f);
        g.drawString("Boosts: "+p1Boost,(WIDTH-(WIDTH/6)),(HEIGHT-(int)(HEIGHT/1.1)));
        g.drawString("Time: "+(10-counter),540,100);
    }
    }

    public static void main (String [] args) {

        new RacerDoom();
    }
}

错误脚本:

线程“主”java.lang.NullPointerException 中的异常

在 java.awt.Container.addImpl(Unknown Source)

在 java.awt.Container.add(未知来源)

在 RacerDoom.(RacerDoom.java:46)

在 RacerDoom.main(RacerDoom.java:232)

我很确定我只是个白痴,答案可能是在错误消息中竖起中指​​,但对我来说仍然是希腊语。但即使(尤其是?)白痴也需要帮助。

【问题讨论】:

  • 这不是“一些错误脚本”,而是 NullPointerException。查看该行并尝试找出其中一个变量为空的原因。这不是火箭科学,但确实涉及弄脏你的手指。检查该行上使用的所有变量(它是哪一行?),首先看看哪个是空的。
  • 我很抱歉。在发布到这里之前,我应该在网上搜索该错误的含义。
  • 这就是我正在做的。当您每周工作 60 多个小时时,传统上很难“学习”。我通过阅读书籍来学习,并从在线社区寻求解决问题的帮助。这与学生向老师寻求帮助没有什么不同,我只是没有教室的好处。但在这里争论是不合适的。感谢您的帮助。

标签: java jframe jpanel paintcomponent


【解决方案1】:

你的错误很简单:

getContentPane().add(panel);

panel = new MainPanel();
panel.setBounds(0,0,WIDTH,HEIGHT);

您在实际创建面板之前将面板添加到寡妇。尝试像这样重新排列它:

panel = new MainPanel();
panel.setBounds(0,0,WIDTH,HEIGHT);
getContentPane().add(panel);

【讨论】:

  • 我可以请你帮我处理我在下面发布的代码吗?这是如此简单的代码,但我不明白我遇到的异常。当我用谷歌搜索它时,它只显示没有实例化变量的错误。我做了实例,它不起作用。所以我不明白这个问题。
【解决方案2】:

我相信第 46 行是:

getContentPane().add(panel);

此时,您尚未创建面板,因此它为空。你can't add a null component to a container。删除该行;你以后的this.getContentPane().add(panel); 就是你所需要的。

【讨论】:

    【解决方案3】:

    出现 NullPointerException 是因为您尝试添加未初始化的变量面板:

    getContentPane().add(panel);
    

    您必须先初始化此变量,然后将其添加到 getContentPane()

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 2017-07-23
      • 2011-09-22
      相关资源
      最近更新 更多