Проблемы с использованием графики с панелями в библиотеке Java Swing

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

Заранее спасибо,

Томек

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
3 897
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Я бы также посмотрел на BufferedImage.

Я понимаю, поэтому я предполагаю, что paintComponent вызывается каждый раз, когда создается JPanel.

Tomek 11.11.2008 05:00

Фактически, он вызывается каждый раз при перерисовке компонента. Swing не запоминает внешний вид каждого компонента, скорее, каждый компонент отвечает за отрисовку и перерисовку себя по мере необходимости.

sblundy 11.11.2008 05:03

Пара вещей: Не забудьте добавить панель к 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

Steve McLeod 04.09.2009 15:03

Другие вопросы по теме