Ladebalken für ImageIO.read()

Liebe Freunde,

wie kann ich einen Ladebalken für ImageIO.read() darstellen lassen?
Es wird nämlich ein ziemlich großes Bild heruntergeladen - da möchte ich nicht den hässlichen und irritierenden Java-Loader verwenden.

Danke euch!
MfG
Inno

direkt wüsste ich keine Lösung, nur eine wo du selbst die Daten lädst und dann daraus das Bild machst.
Wärend er läd kannst du dann jede beliebige Sache darstellen.

zb du lädst per Stream in einen Speicher, wie der genau aussieht weiß ich jetzt nicht genau, wenn du genau weißt wie groß das Bild ist kannst du einen passenden byte-Array anlegen und mit einem ByteArrayOutputStream darein schreiben

Wenn du es dann geladen hast dann nimmst du einen ByteArrayInputStream und liest dann normal mit ImageIO.read(bytearrayinputstream) ein

         URL getURL = new URL(showurl);
         
         InputStream in = null;
         OutputStream out = null;
         URLConnection con = getURL.openConnection();
         
         con.setDoInput(true);
         con.connect();
         in = con.getInputStream();
         
         long downov = con.getContentLength();
         byte[] bbuffer = new byte[(int)downov];
        ByteArrayInputStream imgds = new ByteArrayInputStream(bbuffer);
         //Bytes downloaden:
        byte[] buf = new byte[5000];
        int nread;
        int navailable;
        int total = 0; //Menge an Bytes bisher gesendet
        int percentage = 0; //Percent done...
        int oldpercent = 0;
        ImageInputStream iis;
        byte[] filedata = new byte[con.getContentLength()];
      synchronized (in) {
          while((nread = in.read(buf, 0, buf.length)) >= 0) {
            imgds.read(buf, 0, nread);
            total += nread; //Wieviel bereits gesendet?
            percentage = (int)( ( total * 100.0 ) / downov );
            if(oldpercent < percentage){
               System.out.println("Preview %: " + percentage); 
            }
                oldpercent = percentage;
          }
       }        
        buf = null;
        Image pic=null;
        pic = ImageIO.read(imgds);
        pic = pic.getScaledInstance(getWidth(), getHeight(), pic.SCALE_SMOOTH);
        setImage(pic);
        pic.flush();

ich bekomme aber eine doofe NullPointer bei der Zeile

        pic = pic.getScaledInstance(getWidth(), getHeight(), pic.SCALE_SMOOTH);```

Ansonsten liest er brav die File ein (1%... 2%... usw.).
Was mache ich da noch falsch?


Dank Dir!
**Innió**

sieh mal nach ob pic null ist

pic = ImageIO.read(imgds);

Das Problem liegt in dieser Zeile. :frowning:
imgds scheint keine Daten zu beinhalten :grr:

:frowning:

MfG
Inno

geh mal im Debugger durch ob da alles der Wahrheit entspricht (Größe des Bilds und so)

Größe stimmt - auch alles andere.
Mit einem MediaTracker funktioniert alles (eben aber ohne einen Ladebalken)

Stimmt etwas nicht mit der Download-Schleife?
Ich sitze jetzt schon seit einer Stunde dran.

:frowning:

MfG
Inno

JA da passt einiges nicht wenn man genau hinsieht

         URL getURL = new URL(showurl);
         
         InputStream in;
         OutputStream out;
         URLConnection con = getURL.openConnection();
         
         con.setDoInput(true);
         con.connect();
         in = con.getInputStream();
         
         long downov = con.getContentLength();
         
      	 ByteArrayOutputstream bout = new ByteArrayOutputStream();
         
         
         
         //Bytes downloaden:
        byte[] buf = new byte[5000];
        int nread;
        int navailable;
        int total = 0; //Menge an Bytes bisher gesendet
        int percentage = 0; //Percent done...
        int oldpercent = 0;
        ImageInputStream iis;
        byte[] filedata = new byte[con.getContentLength()];
      synchronized (in) {
          while((nread = in.read(buf, 0, buf.length)) > -1) {
          	bout.write(buff,0,nread);
          	
            total += nread; //Wieviel bereits gesendet?
            percentage = (int)( ( total * 100.0 ) / downov );
            if(oldpercent < percentage){
               System.out.println("Preview %: " + percentage); 
            }
                oldpercent = percentage;
          }
       } 
       
        ByteArrayInputStream imgds = new ByteArrayInputStream(bout.toArray());       
        buf = null;
        Image pic = ImageIO.read(imgds);
        pic = pic.getScaledInstance(getWidth(), getHeight(), pic.SCALE_SMOOTH);
        setImage(pic);
        pic.flush();

probier das mal

Jau, klappt - wie immer :wink:

P.S.: Wie ändere ich eigentlich die Farben der JProgressBar?
Wie kann ich Text in der JProgressBar einblenden?

Danke Dir!

MfG
Inno

äh Text war mit setString glaube
für das Aussehen musst du dich hiermit mal beschäftigen http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JProgressBar.html#setUI(javax.swing.plaf.ProgressBarUI)