Привет всем, я пытаюсь запустить следующую программу, но получаю исключение NullPointerException. Я новичок в библиотеке 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.
Заранее спасибо,
Томек




Вы получаете NPE, потому что g не установлен, следовательно, это null. Кроме того, вы не должны рисовать в конструкторе. Вместо этого перегрузите paintComponent(Graphics g).
public class Gallow extends JPanel {
public paintComponent(Graphics g){
g.fillOval(10, 20, 40, 25);
}
}
Я бы также посмотрел на BufferedImage.
Фактически, он вызывается каждый раз при перерисовке компонента. Swing не запоминает внешний вид каждого компонента, скорее, каждый компонент отвечает за отрисовку и перерисовку себя по мере необходимости.
Пара вещей: Не забудьте добавить панель к 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);
}
}
Вы должны переопределить paintComponent, а не paint
Я понимаю, поэтому я предполагаю, что paintComponent вызывается каждый раз, когда создается JPanel.