Applet Wieso kann ich keine Array im Applet initialisieren

Kallescw

Mitglied
Hallo,

ich will ein Programm schreiben welches die Vorgehensweise von verschiedenen Sortieralgorhytmen verdeutlich
Meine Idee war 5 unterschiedlich Große Bälle zu zeichnen..und immer die jenigen Bälle, die gerade verlgichen werden, nach rechts zu rücken und dann die Positionen gegebenfalls zu tauschen. ICh habe es bisher nur geschafft die Bälle zu zeichnen.
Dies habe ich so gemacht

Java:
public class Graphikdemo extends Applet
{
    int [] größen={20,50,40,30,10};
    Kreis [] kreise = new Kreis[5];
    public int index =0;
    int l;
  public void init()
   {
 for (int i = 0; i <320; i=i+75) 
      {    
        l=i+(25-größen[index]/2);
        kreise[index] = new Kreis(200,100+l,größen[index]);
        index++; 
    }
    
      }

public void paint(Graphics g)
   {  
      g.drawImage(Hintergrund,0,0,900,525,this);
     
          g.setColor(Color.blue);
          g.fillOval(kreise[0].getX()+verschiebung,kreise[0].getY(),kreise[0].getDurchmesser(),kreise[0].getDurchmesser());
          g.fillOval(kreise[1].getX()+verschiebung,kreise[1].getY(),kreise[1].getDurchmesser(),kreise[1].getDurchmesser());
          g.fillOval(kreise[2].getX()+verschiebung,kreise[2].getY(),kreise[2].getDurchmesser(),kreise[2].getDurchmesser());
          g.fillOval(kreise[3].getX()+verschiebung,kreise[3].getY(),kreise[3].getDurchmesser(),kreise[3].getDurchmesser());
          g.fillOval(kreise[4].getX()+verschiebung,kreise[4].getY(),kreise[4].getDurchmesser(),kreise[4].getDurchmesser());
 }

so und jetzt zu mienen eig Problem:

wenn ich das Applet ausführe wird auch alles gezeichnet..wenn ich jedoch mein Apllet Objekt inspiziere hat mein Array an jeder Stelle den wert Null und somit bekomme ich es nicht hin die Kreise des Arrays zu bewegen.
Entweder ich bin generell zu blöd Kreise zu bewegen oder es liegt wirklich daran das mein Array nicht richtig inspiziert wird

könnt ihr mir weiterhelfen?
 
Zuletzt bearbeitet von einem Moderator:
Wie "inpizierst" du das? Im Debugger? Sicher, dass du das machst, nachdem init() aufgerufen wurde?

Insgesamt sieht das ziemlich wackelig aus, mit der Positions- und Indexberechnung... Und... was ist "verschiebung"?
 
Also ich benutze BlueJ.. und da erstelle ich dann das Objekt und durch ein doppelklick darauf kann man dieses inspizieren...wenn ich die methode init aufrufe kommt ein fehler in zeile 20 : java nullpointerexception.

Die Koordinaten werden aber alle richtig berechnet das funktioniert.. ich kann ja auch das Apllet ausführen dann wird alles perfekt angezeigt.. jettzt geht es halt nur darum ein Kreis zu bewegen. Dafür habe ich auch den int Verschiebung gebraucht... Nur irgendwie funktioniert das nicht so richtig.
ein Versuch einen Kreis zu bwegen war zum beispiel:

public void bewgen()
{
while (verschiebung<100)
{
repaint();
verschiebung++
}
}

abgesehen davon das dies So generell nicht funktionieren könnte... glaube ich das schon der fehler da liegt das dem array die werte nicht richtig zugewiesen werden..
 
Hm... 'init()' wird eigentlich automatisch aufgerufen, wenn man das Applet startet. Von wo aus wird die Methode 'bewegen()' denn aufgerufen?


(Ich werd' mir wohl mal BlueJ installieren müssen - da kommen so oft merkwürdige Fragen dazu... ???:L )
 
ja das ist ja auch so eine Sache die mich wundert.. wenn ich das Applet ausführe kommt keine Fehlermeldung..wenn ich jedech erst ein objekt erstelle und dann die methode init aufrufe kommt die fehlermeldung...die methode bewegen habe ich einfach ganz am ende in der klasse implementiert.
 
also ich weiß nicht ob jemand BlueJ kennt..aber da kann man immer objekte erstellen auch von Apllets.. zumindestens wird eins angezeit in der Objektleiste

in zeile 20 steht: Hintergrund = getImage(getCodeBase(),
"Hintergrund.jpg");

hier ist das ganze Programm:

Java:
]import java.awt.*;
import javax.swing.*;
import java.awt.Color.*;
import java.applet.*;
import java.util.*; 

public class Graphikdemo extends Applet
{
   Image Hintergrund;
    int [] größen={20,50,40,30,10};
    Kreis [] kreise = new Kreis[5];
    public int index =0;
    int l;
    int verschiebung;
  Punkt [] punkte = new Punkt[5];
  int vergleiche;
   
    public void init()
   {
       Hintergrund = getImage(getCodeBase(),
             "Hintergrund.jpg");
             
      
             
    for (int i = 0; i <320; i=i+75) 
      {    
        punkte[index]=new Punkt(180,115+i);
        l=i+(25-größen[index]/2);
        kreise[index] = new Kreis(200,100+l,größen[index]);
        index++; 
    }
    
      }
  
  
public void paint(Graphics g)
   {  
      g.drawImage(Hintergrund,0,0,900,525,this);
     
          g.setColor(Color.blue);
          g.fillOval(kreise[0].getX()+verschiebung,kreise[0].getY(),kreise[0].getDurchmesser(),kreise[0].getDurchmesser());
          g.fillOval(kreise[1].getX()+verschiebung,kreise[1].getY(),kreise[1].getDurchmesser(),kreise[1].getDurchmesser());
          g.fillOval(kreise[2].getX()+verschiebung,kreise[2].getY(),kreise[2].getDurchmesser(),kreise[2].getDurchmesser());
          g.fillOval(kreise[3].getX()+verschiebung,kreise[3].getY(),kreise[3].getDurchmesser(),kreise[3].getDurchmesser());
          g.fillOval(kreise[4].getX()+verschiebung,kreise[4].getY(),kreise[4].getDurchmesser(),kreise[4].getDurchmesser());
          g.setColor(Color.red);
          for(int i=0;i<punkte.length;i++)
          {
          g.fillOval(punkte[i].getX(),punkte[i].getY(),punkte[i].getDurchmesser(),punkte[i].getDurchmesser());
        }
        
}
public void bewegen()
{
verschiebung=200;
repaint();

}

}

die klasse Punkt

Java:
class Punkt{
  private int x;
  private int y;
  private int durchmesser=15;

  public Punkt(int x, int y){
    this.x = x;
    this.y = y;
    
  }
  public int getX(){
     return x;
  }
  public int getY(){
     return y;
  }
  
  public int getDurchmesser(){
     return durchmesser;

    }
    
}

die klasse Kreis
Java:
class Kreis{
  private int x;
  private int y;
  private int durchmesser;

  public Kreis(int x, int y, int durchmesser){
    this.x = x;
    this.y = y;
    this.durchmesser = durchmesser;
  }
  public int getX(){
     return x;
  }
  public int getY(){
     return y;
  }
  public int getDurchmesser(){
     return durchmesser;
  }
  public void setY(int y){
    this.y = y;
  }
  public void setX(int x){
    this.x = x;
}

 
  
}


ich habe mal noch nen bild vom applet angehängt
 
also ich weiß nicht ob jemand BlueJ kennt..aber da kann man immer objekte erstellen auch von Apllets.. zumindestens wird eins angezeit in der Objektleiste
Nur weil man etwas kann muss man es nicht auch machen ;-)
Ein Applet ist nicht dafür gedacht "erstellt" zu werden. Keine Ahnung was z.B. getCodeBase() im Fall einer Erstellung im falschen Kontext so liefert. Vermutlich null weil es diese in diesem Fall nicht gibt.
 
Die NullPointerException kommt einfach daher, dass dein Image Hintergrund null ist. Das bedeutet dass das Bild nicht gefunden wurde. --> Daher: Das Bild muss sich bei deiner Initialisierung im selben Ordner wie HTML Datei befinden (Diese wird von BlueJ automatisch beim Start des Applets erzeugt). Im übrigen solltest du dein Applet in BlueJ so ausführen: Rechtsklick auf die Applet Klasse -> "Run Applet" bzw. "Applet ausführen".

...wenn ich jedech erst ein objekt erstelle und dann die methode init aufrufe kommt die fehlermeldung...

Das sollst du auch nicht tun, wie dir bereits schon gesagt wurde. Wenn du die Methode aufrufen willst schlage ich dir vor einen Button mit ActionListener zu implementieren. Wenn dieser dann geklickt wird ruft er die Methode auf.


P.S. Genau an deiner Vorgehensweis lässt sich erkennen, wie unsinnig es ist mit BlueJ zu arbeiten: Rechtsklick: new Klasssenname(), mit der Instanz irgendwelche Methoden aufrufen... Das erschwert einen imho das Java lernen. Lieber die Methoden selbst im Programm aufrufen.
 
okey ich werde morgen mal einen neuen verscuh starten.. und versuchen die methoden mithilfe eines Buttons auszuführen
vielen Dank bis hierhin
 
Zuletzt bearbeitet:
Ganz klarer Fall: Wie bereits erwähnt darf man von einer Applet Klasse keine Instanz bilden und dann erwaren, dass man auch noch geerbte Applet Methoden so ohne weiteres aufrufen kann.

Zur Exception: Sie entsteht meines Wissens dadurch, das versucht wird die Methode getImage aufzurufen, diese jedoch bei diesem Fall immer null zurückgibt da das Applet nicht ordnungsgemäß gestartet wurde. Somit ist es egal ob das Bild vorhanden ist oder nicht, die Methode selbst beinhaltet den Fehler.

Daher: Bei Applets keine Instanz bilden!!!
[TIPP]
Variablen wie etwa größe immer ohne Umlaute und Sonderzeichen schreiben, also hier: groesse.
[/TIPP]
 
Alles klar.vielen Dank für die Mühe!
wer weiß wie lange ich da noch dran rumgedocktort hätte😀
ich werde es morgen nochmal versuchen und auf gar keinen fall Instanzen bilden 😉
 

Neue Themen


Zurück
Oben