[Java] Nullpointer getGraphics

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Wes46
  • Registratie: Augustus 2005
  • Laatst online: 20-03 09:38

Wes46

Keep it simple.

Topicstarter
Ik wil een programma maken dat lijkt op een voorbeeld dat ik heb uit een boek. Dit voorbeeld tekent een balletje zodra je op de startknop drukt. Nu wil ik die startknop eruit hebben en gewoon gelijk dat balletje zien.

Echter wanneer ik de class startknophandler verwijder en er een andere class van maak om die vervolgens in de constructor aan te roepen, geeft hij aan dat getGraphics () een nullpointer is. Hier de code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class lift extends JFrame {
  public static void main( String args[] ) {
    JFrame frame = new lift();
    frame.setSize( 1440, 900 );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.setTitle( "Voorbeeld 1308  Thread met pauzemogelijkheid" );
    frame.setContentPane( new Liftpaneel() );
    frame.setVisible( true );
  }
}


class Liftpaneel extends JPanel {
  private Bal bal;
  private JButton startknop, pauzeknop, eindePauzeknop;

  public Liftpaneel() {
    startknop = new JButton( "Start" );
    pauzeknop = new JButton( "Pauze" );
    eindePauzeknop = new JButton( "Einde pauze" );
    startknop.addActionListener( new StartknopHandler() );
    pauzeknop.addActionListener( new PauzeknopHandler() );
    eindePauzeknop.addActionListener( new EindePauzeknopHandler() );
    add( startknop );
    add( pauzeknop );
    add( eindePauzeknop );
  }

class StartknopHandler implements ActionListener {
    public void actionPerformed( ActionEvent e ) {
      if( bal == null ) {
        bal = new Bal( getGraphics(), 10, getBackground());
        bal.start();
      }
    }
  }


Wie kan mij hiermee helpen?

iRacing


Acties:
  • 0 Henk 'm!

  • xzaz
  • Registratie: Augustus 2005
  • Laatst online: 10:54
getGraphics() van wat? Van welke control moet hij zijn Graphics ophalen?

Schiet tussen de palen en je scoort!


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11:08

Robtimus

me Robtimus no like you

xzaz schreef op zaterdag 17 oktober 2009 @ 17:17:
getGraphics() van wat? Van welke control moet hij zijn Graphics ophalen?
StartknopHandler is een inner class van Liftpaneel, en die inherit getGraphics() weer van JPanel.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • xzaz
  • Registratie: Augustus 2005
  • Laatst online: 10:54
IceManX schreef op zaterdag 17 oktober 2009 @ 17:22:
[...]

StartknopHandler is een inner class van Liftpaneel, en die inherit getGraphics() weer van JPanel.
En toch is die null?

Schiet tussen de palen en je scoort!


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 10:25
Hij is null nadat TS in de code heeft zitten rommelen.

Inhoud van die actionPerformed() methode binnen de constructor van Liftpaneel zetten en dan de knop zelf weghalen zou toch voldoende moeten zijn?

Maar als je op de plaats van StartknopHandler een andere klasse zet die in zijn eigen constructor of zomaar in een methode getGraphics() aanroept, zou dat ook moeten werken omdat dat dan ook weer een inner class is.

Acties:
  • 0 Henk 'm!

  • Wes46
  • Registratie: Augustus 2005
  • Laatst online: 20-03 09:38

Wes46

Keep it simple.

Topicstarter
Raynman schreef op zaterdag 17 oktober 2009 @ 18:02:
[...]

Hij is null nadat TS in de code heeft zitten rommelen.

Inhoud van die actionPerformed() methode binnen de constructor van Liftpaneel zetten en dan de knop zelf weghalen zou toch voldoende moeten zijn?

Maar als je op de plaats van StartknopHandler een andere klasse zet die in zijn eigen constructor of zomaar in een methode getGraphics() aanroept, zou dat ook moeten werken omdat dat dan ook weer een inner class is.
precies dat heb ik dus gedaan maar dan wordt hij juist null. Dat vind ik ook zo vreemd

iRacing


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Dus met andere woorden: getGraphics() retourneert null? De manier waarop je het probleem beschreef suggereert namelijk dat het aanroepen van getGraphics() een NullPointerException veroorzaakt. In het laatste geval is al de code die je hebt gepost irrelevant en zou je de code van getGraphics() moeten tonen, samen met een stacktrace dat de schuldige regel aanwijst.

[ Voor 8% gewijzigd door BalusC op 18-10-2009 00:33 ]


Acties:
  • 0 Henk 'm!

  • Wes46
  • Registratie: Augustus 2005
  • Laatst online: 20-03 09:38

Wes46

Keep it simple.

Topicstarter
Wanneer ik er een regel als dit toevoeg: System.out.printf ("%s\n", getGraphics ());
dan krijg ik null in de situatie die ik wil hebben, dus zonder de startknophandler.
Met startknophandler krijg ik echter wel gewoon de inhoud van getGraphics dus getGraphics returnt null zonder de handler.

iRacing


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 10:25
Tweede resultaat voor "jpanel getgraphics" zegt dat getGraphics() null retourneert totdat er iets zichtbaar is. Dan kun je dus pas iets nadat regel 8 uitgevoerd is. Je kunt een eigen paint()[paintComponent() voor Swing] methode in Liftpaneel definiëren, die precies doet wat StartknopHandler.actionPerformed nu doet.

[ Voor 5% gewijzigd door Raynman op 18-10-2009 11:23 ]


Acties:
  • 0 Henk 'm!

  • Wes46
  • Registratie: Augustus 2005
  • Laatst online: 20-03 09:38

Wes46

Keep it simple.

Topicstarter
Op dit moment heb ik dit. Volgens mijn output via het System.out.printf doet hij precies wat hij nu zou moeten doen. Het gekke alleen is dat ik geen rood balletje zie die hij zou moeten tekenen, ik heb het idee dat ik iets over het hoofd zie :?

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 
public class lift extends JFrame {
  public static void main( String args[] ) {
    JFrame frame = new lift();
    frame.setSize( 1440, 900 );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.setTitle( "Voorbeeld 1308  Thread met pauzemogelijkheid" );
    Liftpaneel paneel = new Liftpaneel ();
    frame.setContentPane(paneel);
    frame.setVisible( true );
  }
}


class Liftpaneel extends JPanel {
  private Bal bal;
  private JButton pauzeknop, eindePauzeknop;

  public Liftpaneel() {
   // startknop = new JButton( "Start" );
    pauzeknop = new JButton( "Pauze" );
    eindePauzeknop = new JButton( "Einde pauze" );
  //  startknop.addActionListener( new StartknopHandler() );
    pauzeknop.addActionListener( new PauzeknopHandler() );
    eindePauzeknop.addActionListener( new EindePauzeknopHandler() );
    //add( startknop );
    add( pauzeknop );
    add( eindePauzeknop );
  }

    public void paintComponent(Graphics g) {
      super.paintComponent (g);
    if( bal == null ) {
        System.out.printf ("test\n");
        bal = new Bal(g, 10, getBackground());
        System.out.printf ("graphics = %s \n", g);
        bal.start();
      }
  }


  class PauzeknopHandler implements ActionListener {
    public void actionPerformed( ActionEvent e ) {
      if( bal != null )
        bal.pauzeer();
    }
  }

  class EindePauzeknopHandler implements ActionListener {
    public void actionPerformed( ActionEvent e ) {
      if( bal != null )
        bal.pauzeVoorbij();
    }
  }
}


class Bal extends Thread {
  private Graphics pen;
  private int x, y, grootte;
  private Color wiskleur;
  private int dy;
  private boolean doorgaan, pauze;


  public Bal( Graphics g, int grootte, Color wiskleur ) {
    this.pen = g;
    System.out.printf ("%s \n", g);
    this.grootte = grootte;
    this.wiskleur = wiskleur;
    x = 200;
    y = 300;
    dy = 1;
    doorgaan = true;
    pauze = true;
  }

  public void run() {
    while( doorgaan ) {
      teken( Color.red );
      slaap( 10 );
      teken( wiskleur );
      verplaats();
      System.out.printf ("nu in bal.teken\n");
    }
  }

  public void teken( Color kleur ) {
      System.out.printf ("%s \n", pen);
    pen.setColor( kleur );
    pen.fillOval( x, y, grootte, grootte );
          System.out.printf ("%s \n", pen);
  }

  public void nuStoppen() {
    doorgaan = false;
  }

  public void pauzeer() {
    pauze = true;
  }

  public synchronized void pauzeVoorbij() {
    pauze = false;
    notify();
  }

  private synchronized void controleerPauze() throws
                                      InterruptedException {
    while( pauze ) {
      wait();
    }
  }

  private void verplaats() {
    if( y + dy > 300 || y + dy < 100 ) {
      dy = -dy;
    }
    y += dy;
  }

  private void slaap( int millisec ) {
    try {
      Thread.sleep( millisec );
      controleerPauze();
    }
    catch( InterruptedException e ) {}
  }
}

iRacing


Acties:
  • 0 Henk 'm!

  • Wes46
  • Registratie: Augustus 2005
  • Laatst online: 20-03 09:38

Wes46

Keep it simple.

Topicstarter
anyone?

iRacing


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

De denkfout die je maakt gaat over het Graphics object. In tegenstelling tot wat jij denkt is dat graphics object alleen maar van toepassing waneer het panel gepaint wordt. Het is niet een handler die voor altijd aan het scherm verbonden blijft waarop je kunt tekenen.

Ik zou nu wel kunnen gaan uitleggen hoe het painten in Java precies werkt, maar het lijkt me handiger wanneer je de volgende tutorial even doorneemt om een beetje 'feeling' te krijgen:

http://java.sun.com/docs/...swing/painting/index.html

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Wes46
  • Registratie: Augustus 2005
  • Laatst online: 20-03 09:38

Wes46

Keep it simple.

Topicstarter
Ok bedankt, ik zal het even doornemen

iRacing

Pagina: 1