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();
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.