28. februar 2004 - 19:38Der er
11 kommentarer og 2 løsninger
Tråd, der animerer en bold i en JApplet
Jeg er i gang med at lave et ret simpelt animationsprogram i Java. Tanken var at lave en JApplet, der starter en tråd, som så med et bestemt interval tegner noget ved hjælp af applet'ens Graphics objekt. Imidlertid får jeg en:
java.lang.NullPointerException
at øv7.BallAnimatingThread.run BallAnimatingThread.java:54)
Når jeg prøver at bruge Graphics. Koden er som følger:
package øv7;
import java.awt.*; import javax.swing.*;
/** * Animerer en bold i et JApplet vindue * * @author Dennis Riis * @version 1.0 */ public class BallAnimatingThread extends StoppableThread { /** * Starter animation på <code>destination</code>, en bold med størrelse * <code>ballSize</code> og hastighed <code>speed</code> * @param destination Destination JApplet * @param ballSize I pixels * @param speed Hastighed i pixels/second */ public BallAnimatingThread(JApplet destination, int ballSize, int speed) { dest = destination; size = ballSize; pos = new Point(ballSize,ballSize); dp = new Point(5,5); if ( speed > 0 ) { updSpeed = (speed * 1000) / 5; }else { updSpeed = 200 ; }
// Start tråden med det samme. start(); }
/** * Tråd startpunkt */ public void run() { Color bg = dest.getBackground(); Rectangle clip;
while (canRun) { // Hent graphics object hver gang, så vi er sikre på at have de // rigtige dimensioner. g = dest.getGraphics();
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
Nu har jeg fundet fejlen. dest.getGraphics returnerer kun et Graphics object hvis vinduet er synligt på skærmen. Derfor går det galt i opstartsfasen, og også hvis man trækker et andet vindue hen over applet vinduet. Jeg har løst det ved kun at opdatere, hvis vinduet er synligt: if ( g != null ) { ... }
Fra java dokumentationen for getGraphics: /** * Creates a graphics context for this component. This method will * return <code>null</code> if this component is currently not * displayable. * @return a graphics context for this component, or <code>null</code> * if it has none * @see #paint * @since JDK1.0 */
Som conrad siger, får du startet din tråd før din applet er initieret, hvilket gør at 'g' er null
Så du skal altså have flyttet new BallAnimatingThread() længere ned i din kode så du sikrer at appletten er fuldt initieret.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.