OutOfMemoryError bei Foto-Vorschau

Status
Nicht offen für weitere Antworten.

grisu211

Mitglied
Hallo!

Ich möchte bestimmte fotos eines ordners zur weiteren bearbeitung auswählen.
Dafür brauche ich eine Übersicht über die Fotos mit Auswahlmöglichkeit, hab ich auch alles schon geschrieben und funktioniert, bis auf die Tatsache, dass ich nur maximal 5 Fotos anzeigen kann.

Bei 6 bekomme ich nen OutOfMemoryError.

Ich hab mich inzwischen hier und im halben internet durch ähnliche Themen durchgelesen...bringt mich nur leider nicht weiter.

Also... ich reiche den Dateinamen durch bis in das Panel auf das das foto gezeichnet wird.
und dann passiert folgendes:
Code:
public class FotoPanel extends JPanel {
   private Image foto;

   public FotoPanel(File datei) {
      try {
         foto = ImageIO.read(datei);
         foto = foto.getScaledInstance(this.getWidth()-20,this.getHeight()-10,Image.SCALE_FAST);
      }
      catch(IOException ioe) {
         this.setBackground(Color.WHITE);
      }
   }

   public void paint(Graphics g) {
      if(foto != null) {
         g.drawImage(foto, 10, 10, foto.getWidth(this), foto.getHeight(this), this);
      }
      else
         g.drawString("Datei kann nicht\n geladen werden", 0,0);
   }
}

mehr steht in der klasse nicht drin.

wie gesagt beim 6. foto kommt der error.

es muss doch irgendwie möglich sein mehr als 5 fotos in der vorschau zu haben. die thumbs sind im endeffekt maximal ca 100*100 px groß.

Ich hoffe es kann mir jemand weiterhelfen...

Gruß Jan
 

lin

Top Contributor
ich nehme an, du musst die heap size erhöhen, das machst du mit dem parameter -Xmx<size>.
 
R

Roar

Gast
ich nehme an du hast einen programmierfehler. zeig mal den restliche nrelevanten code...
 

grisu211

Mitglied
Hi und danke schonmal für die ersten Antworten.

1. wie erweitere ich den heap? wo gebe ich "-Xmx<size>" ein?

2. lieber wäre mir wenn ich tatsächlich nur nen fehler hätte.
hier nochmal etwas code..

diese klasse beinhaltet das gestern gepostete FotoPanel:
Code:
public class FotoAuswahl extends JPanel{

   private FotoPanel foto;
   private JCheckBox checkbox;
   private Container unten = new Container();

   public FotoAuswahl(File datei) {
      this.setBackground(Color.WHITE);

      foto = new FotoPanel(datei);

      checkbox = new JCheckBox(datei.getName());
      checkbox.setBackground(Color.WHITE);

      this.setLayout(new BorderLayout());
      unten.setLayout(new FlowLayout(FlowLayout.CENTER));

      unten.add(checkbox);
      this.add(foto, BorderLayout.CENTER);
      this.add(unten, BorderLayout.SOUTH);
   }
}

und hier werden die FotoAuswahl-instanzen angezeigt:

Code:
public class FotoExplorerViewport extends JPanel
    implements Scrollable {

   private Vector fotos = new Vector();
   private int hoehe = 0;


   public FotoExplorerViewport(File[] files) {
      this.setBackground(Color.WHITE);
      this.setLayout(null);

      for(int i=0; i<files.length;i++) {
         fotos.add(new FotoAuswahl(files[i]));
      }
      positioniereFotos();
   }

   protected void positioniereFotos() {
      if(!fotos.isEmpty()){
         FotoAuswahl akt = (FotoAuswahl) fotos.get(0);

         int pbreite = this.getParent().getWidth();
         int fbreite = akt.getPreferredSize().width;
         int fhoehe = akt.getPreferredSize().height;
         int spaltenAnzahl = pbreite / fbreite;
         int zeilenAnzahl = fotos.size() / spaltenAnzahl;
         if(fotos.size() % spaltenAnzahl != 0)
            zeilenAnzahl++;
         hoehe = zeilenAnzahl * fhoehe;
         int i = 0;

         for (int z = 0; z < zeilenAnzahl && i < fotos.size(); z++) {
            for (int s = 0; s < spaltenAnzahl && i < fotos.size(); s++, i++) {
               akt = (FotoAuswahl) fotos.get(i);
               this.addFoto(akt, s * fbreite, z * fhoehe);
            }
         }
      }
   }


   private void addFoto(FotoAuswahl foto, int x, int y) {
      System.out.println("x: "+x+" y: "+y+" Name: "+foto.getText());
      foto.setBounds(x, y, foto.getPreferredSize().width,
                     foto.getPreferredSize().height);
      this.add(foto);
   }
// (...) die restlichen Methoden sind überschriebene Methoden von Scrollable
}

ich kann mir leider nicht vorstellen wo noch was Speicherfressendes auftaucht außer die skalierung der fotos.
aber wie gesagt..es muss doch irgendwie gehen und ich kann den Heap ja auch nicht ewig erweitern, die anzahl der fotos in einem ordner kann ja nun mal etwas größer sein.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben