Настройка JPanel в JFrame? - PullRequest
       50

Настройка JPanel в JFrame?

3 голосов
/ 03 октября 2011

Итак, я работал над переделкой своего кода, чтобы рисование выполнялось в JPanel, а не в JFrame, чтобы я мог выполнить очень необходимую буферизацию изображения.

Я искал StackOverflow, и я погуглил мои пальцы сырыми, и я думал, что настроил его правильно, но он не работает.Я просто получаю пустой белый экран и скрипт ошибки в терминале.Любая помощь приветствуется.Вот код

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();
    }
}

Сценарий ошибки:

Исключение в потоке "main" java.lang.NullPointerException

на java.awt.Container.addImpl (неизвестный источник)

в java.awt.Container.add (неизвестный источник)

в RacerDoom. (RacerDoom.java:46)

в RacerDoom.main (RacerDoom.java:232)

Я совершенно уверен, что я просто идиот, и ответ, вероятно, дает мне средний палец в сообщении об ошибке, но он все еще греческий для меня.Но даже (особенно?) Идиотам нужна помощь.

Ответы [ 3 ]

6 голосов
/ 03 октября 2011

Ваша ошибка довольно проста:

getContentPane().add(panel);

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

Вы добавляете панель к вдове до , когда панель фактически создается. Попробуйте переставить его так:

panel = new MainPanel();
panel.setBounds(0,0,WIDTH,HEIGHT);
getContentPane().add(panel);
1 голос
/ 03 октября 2011

Исключение NullPointerException возникает из-за того, что вы пытаетесь добавить панель неинициализированных переменных:

getContentPane().add(panel);

Вы должны сначала инициализировать эту переменную, а затем добавить ее в getContentPane ()

1 голос
/ 03 октября 2011

Я считаю, что строка 46:

getContentPane().add(panel);

На данный момент вы еще не создали панель, поэтому она пуста. Вы не можете добавить нулевой компонент в контейнер . Удалить эту строку; ваше позднее this.getContentPane().add(panel); - это все, что вам нужно.

...