2008-11-11 2 views
0

Привет всем, Я пытаюсь запустить следующую программу, но получаю исключение NullPointerException. Я новичок в библиотеке Java swing, поэтому я могу делать что-то очень немое. В любом случае, это мои два класса, на которых я сейчас играю, и все, что я хочу сделать, это нарисовать чертов круг (не хочу рисовать галлоу, в конце концов, с палачом).Проблемы с использованием графики с панелями в библиотеке Java Swing

package hangman2; 

import java.awt.*; 
import javax.swing.*; 

public class Hangman2 extends JFrame{ 
    private GridLayout alphabetLayout = new GridLayout(2,2,5,5); 
    private Gallow gallow = new Gallow(); 

    public Hangman2() { 

     setLayout(alphabetLayout); 

     setSize(1000,500); 
     setVisible(true); 

    } 

    public static void main(String args[]) { 
    Hangman2 application = new Hangman2(); 
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 


package hangman2; 

import java.awt.*; 
import javax.swing.*; 

public class Gallow extends JPanel { 
    private Graphics g; 

    public Gallow(){ 
     g.fillOval(10, 20, 40, 25);  
    } 
} 

Исключение NullPointerException происходит в строке g.fillOval.

Спасибо заранее,

Томек

ответ

4

Вы получаете NPE, потому что g не установлен, поэтому, это null. Кроме того, вы не должны рисовать чертеж в конструкторе. Перегрузка paintComponent(Graphics g).

public class Gallow extends JPanel { 
    public paintComponent(Graphics g){ 
     g.fillOval(10, 20, 40, 25);  
    } 
} 

Я также рассмотрю BufferedImage.

+0

Я вижу, поэтому я предполагаю, что paintComponent вызывается каждый раз, когда создается JPanel. – Tomek 2008-11-11 02:00:49

+0

Фактически, это называется каждый раз, когда компонент перерисовывается. Swing не запоминает внешний вид каждого компонента, а каждый компонент отвечает за рисование и перерисовку по мере необходимости. – sblundy 2008-11-11 02:03:35

0

Несколько вещей: не забудьте добавить панель в JFrame. И переопределите метод paint()JPanel для вашей собственной картины. Вам не нужно объявлять объект Graphics, поскольку метод рисования JPanel будет иметь ссылку на один в любом случае.

package hangman2; 

import java.awt.*; 
import javax.swing.*; 

public class Hangman2 extends JFrame{ 
    private GridLayout alphabetLayout = new GridLayout(2,2,5,5); 
    private Gallow gallow = new Gallow(); 

    public Hangman2() { 

     setLayout(alphabetLayout); 
     add(gallow, BorderLayout.CENTER);//here 
     setSize(1000,500); 
     setVisible(true); 

    } 

    public static void main(String args[]) { 
     Hangman2 application = new Hangman2(); 
     application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 


package hangman2; 

import java.awt.*; 
import javax.swing.*; 

public class Gallow extends JPanel { 

    public Gallow(){ 
     super(); 
    } 

    public void paint(Graphics g){ 
     g.fillOval(10, 20, 40, 25);  
    } 
} 
Смежные вопросы