Объект Graphics2D всегда дает исключение NullPointerException - PullRequest
0 голосов
/ 13 октября 2011

Я хочу создать простую программу для рисования;

Здесь я события моей мыши mousePressed и mouseDragged:

private void mousePressed(java.awt.event.MouseEvent evt) {
    touch = evt.getPoint();
    pressed = true;
}


private void mouseDragged(java.awt.event.MouseEvent evt) {
    Point p = evt.getPoint();
    if(pressed){
        graphics2D.drawLine(touch.x, touch.y, p.x, p.y);
    }
    repaint();
}

Но когда я пытаюсь нарисовать что-то, в этой строке всегда получается "Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException" graphics2D.drawLine(touch.x, touch.y, p.x, p.y);

Я также переопределил метод paintComponent

public void paintComponent(Graphics g){
    if(image == null){
        image = createImage(getSize().width, getSize().height);
        graphics2D = (Graphics2D)image.getGraphics();
        graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        clear();
    }
    g.drawImage(image, 0, 0, null);
}

И я ясный метод:

public void clear(){
    graphics2D.setPaint(Color.white);
    graphics2D.fillRect(0, 0, getSize().width, getSize().height);
    graphics2D.setPaint(Color.black);
    repaint();
}

Что мне делать?

Спасибо

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Вы должны прочитать о том, как рисовать вещи в Java: Рисование в AWT и Swing

Если вы используете Swing для создания пользовательского рисования, вы должны переопределить метод paintComponent(Graphics g) на компоненте, для которого вы хотите сделать пользовательское рисование и выполнить рисование внутри этого переопределенного метода.В этом методе вы всегда получите инициализированный объект Graphics.

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

Вы ничего не указали о graphics2D.Я предполагаю, что это поле, которое вы никогда не инициализируете, поэтому оно всегда будет иметь нулевое значение.

Вероятно, вам следует добавить линию в какой-то список «линий для рисования», а затем фактическиделать часть рисунка в обработчике краски.Это событие, которое нужно обработать, когда вы хотите рисовать.

0 голосов
/ 14 октября 2011

Ваш опубликованный код выглядит разумно.Вы инициализируете переменную graphics2D при создании изображения.

Пользовательские подходы к рисованию показывает два способа сделать это.Одним из подходов является рисование BufferedImage, которое похоже на то, что вы пытаетесь сделать.Сравните код, чтобы увидеть, что отличается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...