# Image Problem



## Siegfried (9. Jan 2008)

Hey.
Ich hab eine kleine Klasse ProgressBar geschrieben und sie funktioniert.
Das Problem ist nur die Bar wird immer wieder neugezeichnet, also es werden mehrere Images untereinander gezeichnet. Kann hier auch etwas wie \r (Wird ja bei Text also chars oder strings verwendet) oder so verwendet werden, damit das Image nicht immer wieder neugezeichnet wird sondern immer an der gleichen stelle??
Hier ist der Code :

```
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.lang.*;

public class ProgressBar
{
   int isProgress = 0; // 133 ist der MaximalWert!
   Image PB = Image.createImage(135,5);
   Graphics Grafik = PB.getGraphics();

   public ProgressBar(Form f)
   { 
      Grafik.drawLine(0,0,135,0);
      Grafik.drawLine(135,0,135,5);
      Grafik.drawLine(135,5,0,5);
      Grafik.drawLine(0,5,0,0);
      Grafik.setColor(0x000000);
      Grafik.fillRect(1,1,134,4);
      Grafik.setColor(0x0088FF);
      Grafik.fillRect(1,1,isProgress,3);
      
      f.append(PB);

      for (int P=0; P <= 133; P++) 
      {
         isProgress = isProgress + 1;
         Grafik.setColor(0x0088FF);
         Grafik.fillRect(1,1,isProgress,3);
         f.append(PB);
      }
   }
}
```
Danke im Voraus .
Gruß, Siegfried .

Edit : Code verändert!


----------



## Backwardsman (10. Jan 2008)

naja, also wenn du dir deine funktion anschaust und dir mal die for-schleife ausgeschrieben vorstellst steht da ja so was wie:

form.append(grafik);
form.append(grafik);
form.append(grafik);
form.append(grafik);
...
form.append(grafik);
form.anzeigen();

erst nach dem die funktion fertig ist, wird dann dein Form angezeigt, klar also, dass da 134 bilder aneinander gehängt angezeigt werden.

was du machen musst ist, eine graf dranhängen, dann dafür sorgen, dass das form (mit einer grafik) angezeigt wird, nach einer gewissen zeit (also ein paar milisekunden) das Form komplett neu zusammenstellen (wieder mit einer grafik) und dann diese anzeigen, und diesen vorgang dann 133 mal wiederholen.

so ungefähr:

for ( i = 1 to 133) {
    form = new Form();   //neues Form erstellen
    form.append (getGrafik(i));
    form.anzeigen();
    Thread.sleep(x);       // x ms warten
}


----------



## Siegfried (10. Jan 2008)

Also das versteh ich jetzt nicht.
Und vor allem Wieso Thread? Die Klasse leitet sich von Thread noch nicht einmal ab.
Ich hab den Code jetzt so verändert jetzt wird aber garnichts mehr gedrawt.

```
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.lang.*;

public class ProgressBar
{
   int isProgress = 0; // 133 ist der MaximalWert!
   Image PB = Image.createImage(135,5);
   Graphics Grafik = PB.getGraphics();

   public ProgressBar(Form f)
   { 
      Grafik.drawLine(0,0,135,0);
      Grafik.drawLine(135,0,135,5);
      Grafik.drawLine(135,5,0,5);
      Grafik.drawLine(0,5,0,0);
      Grafik.setColor(0x000000);
      Grafik.fillRect(1,1,134,4);
      Grafik.setColor(0x0088FF);
      Grafik.fillRect(1,1,isProgress,3);
      
      f.append(PB);

      for (int P=0; P <= 133; P++) 
      {
         f = new Form("Prozess läuft...");
         isProgress = isProgress + 1;
         Grafik.setColor(0x0088FF);
         Grafik.fillRect(1,1,isProgress,3);
         f.append(PB);
      }
   }
}
```


----------



## Backwardsman (10. Jan 2008)

die Thread.sleep() funktion ist statisch, die bentutz man einfach nur um eine pause einzubauen, immerhin willst du den balken doch wachsen lassen oder? und ein wachsender balken besteht aus balken verschiedener länge die "schnell" übereinander gezeichnet werden... die schnelligkeit hängt dabei ab, wie lange du warstest bis der balken übermalt wird, deswegen die sleepfunktion... wenn du so was nicht einbaust, geht das alles so schnell dass du gar nicht sehen kannst, dass der balken gewachsen ist!

was hast du denn jetzt geändert??

ich glaube du hast dich total übernommen? bzw schon zu viel gecoded und jetzt weiß man nicht wo das problem überhaupt ist!

fang doch mal ganz klein an... schreib ein ganz einfaches midlet, welches einen ganz einfachen Form angzeigt, welcher alle paar sekunden über schrieben wird.
also z.b. als erstes zeigst du new Form("A"); an, dann 2 sekunden später soll new Form("B") angzeigt werden und wieder 2 sekunden später new Form("C")... wenn du das hinbekommen hast, kannst du in die forms die grafik einbetten etc.

... versuch dich erstmal an der grundfunktionalität, also das automatische anzeigen bzw. überschreiben von forms... wenn du das raushast ist der ladebalken ganz einfach!


----------



## Siegfried (10. Jan 2008)

Ja gut ich hab das mal gecodet.

```
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.lang.*;

public class Test extends MIDlet
{
   Display display;
   Form f;   

   public Test()
   {
      display=Display.getDisplay(this);
   }

   protected void startApp()
   throws MIDletStateChangeException
   {
      display.setCurrent(f);
      f = new Form("A");
      Thread.sleep(5000);
      f = new Form("B");
      Thread.sleep(5000);
      f = new Form("C");
   }

   protected void pauseApp()
   {
   }

   protected void destroyApp(boolean unconditional)
   throws MIDletStateChangeException
   {
   }
}
```

Wenn das was du sagtst stimmt müsste es gehen doch der Compiler sagt folgendes.

Project settings saved
Building "TestPRJ"
C:\Programme\Java\WTK22\apps\TestPRJ\src\Test.java:20: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
      Thread.sleep(5000);
                  ^
C:\Programme\Java\WTK22\apps\TestPRJ\src\Test.java:22: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
      Thread.sleep(5000);
                  ^
2 errors
com.sun.kvem.ktools.ExecutionException
Build failed


----------



## MiMij (11. Jan 2008)

Mal abgesehen von der Fehlermeldung, du setzt am Anfang das Display auf f, dabei ist f noch null, dann machst du ne neue Form, wartest, machst noch ne neue Form, wartest. Aber du sagst dem nirgends das der die neue Form auch anzeigen soll?!


----------



## Backwardsman (11. Jan 2008)

zu deiner fehlermeldung sag ich nur:

lern' erstmal die java-grundlagen, bevor du mit j2me anfängst!!!

das klingt vielleicht hart, aber wenn man die grundlagen nicht kennt, sollte man nicht gleich mit j2me anfangen... und die kenntnis über exceptions und wie man sie fängt, gehört einfach zu den grundlagen!

mit was programmierst du überhaupt? ich kann dir nur zu eclipseME raten, eclipse hätte dich schon während dem entwickeln darauf hingewiesen, dass ein exception abgefangen werden muss ... aber das hat alles keinen sinn, wenn du nicht weißt, warum da ein fehler auftritt!!!

und wenn du dann mal so weit bist, dass du mit j2me anfangen kannst... dann starte mal mit einem helloworld-midlet... bau forms ein, wechsle zwischen forms etc. so dass du ein gefühl für die gui bekommst.... und wenn du das alles raushast, wirst du schon selbst merken, wie man einen ladebalken bastelt, aber im moment seh ich keine chance!


----------



## Siegfried (11. Jan 2008)

aha ja gut.
Momentan trag ich auch eh nur kenntnisse aus C++.
Aber wenn ich die J2Se mit der J2ME vergleiche seh ich ne menge unterschiede.
Ist ja auch egal.
Thx.


----------



## MiMij (11. Jan 2008)

@Siegfried
Naja aber die Grundkentnisse sollte man haben! Da die Fehlermeldungen in J2ME sehr verwirrend sein koennen, und keine Zeilenangaben enthalten im Gegensatz zu Java Se


----------



## ARadauer (11. Jan 2008)

```
try {
			Thread.sleep(5000);
		}catch (InterruptedException e) {}
```

verwendest du keine ide????


----------



## Backwardsman (11. Jan 2008)

Siegfried hat gesagt.:
			
		

> Ist ja auch egal.


na, dann kanns ja nicht so wichtig gewesen sein...


----------



## Siegfried (11. Jan 2008)

das mit dem try block funktioniert^^ thx


----------

