Toon posts:

[JAVA] getGraphics levert null af...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Na de onenigheid met mijn applicatie gisteren en dit te hebben opgelost met jullie dacht ik vandaag weer even verder te gaan :)

Maar het ging dus weer fout :( Probleem is dat ik de methode getGraphics() uitvoer maar deze levert altijd null af (zal vast wel weer zo een leipe fout zijn als gisteren maar ik zie hem niet)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package audio;

import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;

public class InfoScreen extends JPanel {

   private ShowTime timeThread;

   public InfoScreen() {
    this.setLayout(null);
    this.setSize(110, 60);
    this.setBackground(new Color(77, 77, 77));

    Graphics ourGraphics = this.getGraphics();
    System.out.println(ourGraphics);

    timeThread = new ShowTime(ourGraphics);
    timeThread.start();
  }
}

Waar kan dit aan liggen, is het de JPanel?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Als je iets op je JPanel wilt zetten moet je gewoon ff een JLabel erop plakken :)

Ik heb nog nooit zoiets gezien met getGraphics..

en het is ook wel even handig als je de code van de ShowTime classe er even bij zet want het kan zijn dat daar iets misgaat met bv het doorgeven van de Graphics parameter.

edit:
toch niet want anders had je hier geen null op je scherm gekregen:
code:
1
2
Graphics ourGraphics = this.getGraphics();
System.out.println(ourGraphics);

Maar plak gewoon ff een JLabel op je scherm.. is eigelijk wel standaard voor dit soort dingen.

Verwijderd

Topicstarter
ok zoals je zei niet echt nodig maar ik post em nog wel even dan :) Dit is dus een inner class...
code:
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
class ShowTime extends Thread {
  private int totalTimeInSecLeft = 0;
  private int timeInSecLeft = 0;
  private int timeInMinLeft = 0;
  private Graphics g;

  public ShowTime(Graphics g) {
    this.g = g;
    System.out.println(this.g);
  }

  public void run() {
    while(true) {
    totalTimeInSecLeft = Gui.myWinAmp.timeLeft();
    timeInSecLeft = calcSec(totalTimeInSecLeft);
    timeInMinLeft = calcSec(totalTimeInSecLeft);

    //  g.drawString(""+timeInSecLeft, 30, 5);
    //  g.drawString(""+timeInMinLeft, 10, 5);

    try {
      Thread.sleep(1000);
    }
    catch(InterruptedException ie) {
    }
    }
  }

  private int calcMin(int totalTime) {
    int myTimeInMinLeft = totalTime/60;
    return myTimeInMinLeft;
  }

  private int calcSec(int totalTime) {
    int myTimeInSecLeft = totalTime % 60;
    return myTimeInSecLeft;
  }
}

Ik wil er best een JLabel opzetten, maar hoe krijg ik dat in hemelsnaam via die thread op het scherm dan?

Zoals je ziet was het dus de bedoeling om twee Strings te tekenen die die twee variablen op mijn scherm zouden zetten. Maar ik kan in die thread geen JLabel adden... Dus zou ik een static protected method moeten maken om de text van JLabel te setten?

Ik schrijf maar op wat me nu zo te binnen schiet hoor...

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 19:19
Wat dacht je van dat label dan aan je thread doorgeven ipv de Graphics?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Hmmm.. Als je die JLabel meegeeft moet je wel zorgen dat je die setText op de Swing Thread doet en dat doe je in een timer thread niet.

zie:
http://java.sun.com/j2se/1.4/docs/api/javax/swing/SwingUtilities.html#invokeAndWait(java.lang.Runnable)

en:
http://java.sun.com/j2se/1.4/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)

Er staat hier ook wel en verwijzing naar een tutorial:
http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html

  • windancer
  • Registratie: Maart 2000
  • Laatst online: 08-09 01:06
Misschien moet je, in je constructor, beginnen met super() zodat alle standaard JPanel dingetjes ge-construct zijn.

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 19:19
Op vrijdag 01 maart 2002 07:04 schreef windancer het volgende:
Misschien moet je, in je constructor, beginnen met super() zodat alle standaard JPanel dingetjes ge-construct zijn.
Dat wordt standaard al gedaan (ok het is netter om het wel te doen, maar het hoeft dus niet). Compile dit maar eens:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class A
{
    A(int parameter)
    {
    }
}

public class B extends A
{

    B()
    {
    }
}

Verwijderd

Andere oplossingen zijn allemaal wel leuk en aardig maar waarom levert die getGraphics() null op :?
wat als je eens super.getGraphics() probeert te doen?

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 19:19
Omdat ie in de constructor de Graphics wil hebben en die wordt pas gemaakt als je show() hebt gedaan ergens.
API:
public Graphics getGraphics()
Creates a graphics context for this component. This method will return null if this component is currently not displayable.
Wat je dus beter kan doen is die thread laten staten door paint(Graphics g). Dan weet je nl zeker dat je een Graphics object hebt.

Verwijderd

probeer eens addNotify();

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

nog een keer :)

probeer het met een JLabel (niet zomaar gaan tekenen op componentjes) en dat ff goed letten op de Swing thread.
Pagina: 1