2016-06-04 2 views
1

Так что прямо сейчас, я новичок в использовании графики java awt. У меня есть основы, как, например, как на самом деле помещать вещи на экран, но моя основная проблема заключается в том, что я пытаюсь создать собственные методы для использования за пределами файла класса.Пользовательские методы для графики в java.awt.graphics

Для моего класса экрана:

import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 
    public class Screen extends JPanel{ 
     Graphics g = null; 
     public void createBox(int x, int y, int width, int height){ 
      g.fillRect(x, y, width, height); 
     } 
    } 

Для моего класса Draw, используя класс экрана, а также:

import javax.swing.*; 
    public class Draw{ 
     public static void main(String[] args) { 

      JFrame f = new JFrame("Shapes"); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      Screen s = new Screen(); 
      s.createBox(10,10,10,10); 
      f.add(s); 
      f.setSize(512, 512); 
      f.setVisible(true); 
     } 

    } 

Даже когда у меня есть графики г; без него объявляется, я все еще получаю такое же существо ошибки:

Exception in thread "main" java.lang.NullPointerException 
at Screen.createBox(Screen:java:7) 
at Draw.main(Draw:java:8) 

createBox() предполагается использовать вне класса Screen, так что я по-прежнему можно использовать FillRect(), но с другим именем (я надеюсь, что это имеет смысл).

Может ли кто-нибудь указать, что я делаю неправильно? Благодарю.

ответ

2

Может ли кто-нибудь указать, что я делаю неправильно?

Не пытайтесь сохранить ссылку на объект Graphics! Вместо этого переопределите метод paintComponent(Graphics) и используйте этот (действительный, а не null) графический экземпляр. Чтобы вызвать краску, вызовите repaint().

Весь этот материал покрыт tutorial on custom painting. Пройти через это!

+0

Дело в том, что я не хочу использовать paintComponent. Я хочу сделать это, если бы я набрал createBox в другом классе, я мог бы создать прямоугольник на экране. –

+0

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

+0

Тогда вы не ответили на мой вопрос. Я имею в виду, что я неправильно сделал неправильный способ рисования. Я пытался поместить коробку на экран по-другому. –

Смежные вопросы