Cześć wszystkim forumowiczom!
Na wstępie chciałem zaznaczyć, że jestem tu nowy więc proszę o wyrozumiałość ;)
Zamierzam stworzyć galerię, do której dodaje się folder z obrazami. Za pomocą niej będzie się wybierać obraz, który następnie będzie dalej przetwarzany przez program. Niestety mam problem z samym ich wyświetleniem.
Np.: mam folder zawierający 1500 obrazów. Mój program powinien działać tak:
- wczytuje wszystkie zdjęcia z folderu i dodaje do tablicy dynamicznej,
- powiększa JScrollPane'a tak, aby zmieściły wszystkie obrazy,
- tworzy 20 obiektów klasy Item, które wyświetlają obraz i dodaje je do JScrollPane'a
- jeśli przesuniemy suwak w dół i puścimy go to zmienia obrazy obiektów klasy Item na te, które powinny znajdować się w tym miejscu i przesuwa je w dół tam gdzie znajduje się suwak
Dzięki temu można wybrać z tych 1500 obrazów te, które nas interesują usuwając i wczytując je po kolei.
Niestety w moim programie dochodzi do wycieku pamięci gdy ma się wczytać trzecia "dwudziestka" obrazów. Wywala błąd:
Exception in thread "Image Fetcher 1" Exception in thread "Image Fetcher 2" java.lang.OutOfMemoryError: Java heap space
Oto kod głównej klasy...
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import javax.swing.*;
class MainWindow extends JFrame {
Item ci[];
ArrayList<Image> im = new ArrayList<Image>();
JScrollPane jsp;
JScrollBar jsb;
JPanel panel = new JPanel();
int maxy = 20, cy = -1;
MainWindow() {
setSize(300, 630);
setLocation(30, 200);
setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
panel.setLayout(null);
panel.setLocation(0, 0);
jsp = new JScrollPane(panel);
jsp.setSize(275, 550);
jsp.setLocation(0, 0);
add(jsp);
jsb = jsp.getVerticalScrollBar();
jsb.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent ae) {
if(!jsb.getValueIsAdjusting()) {
cy = (int) (jsp.getViewport().getViewPosition().getY()-50)/140;
if(cy > maxy && cy != 0) showItems(cy);
}
}
});
JButton butt = new JButton("Przeglądaj..");
butt.setSize(100, 25);
butt.setLocation(100, 560);
butt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JFileChooser fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int result = fc.showOpenDialog(null);
if(result == JFileChooser.APPROVE_OPTION) {
File f = fc.getSelectedFile();
String path = f.getAbsolutePath();
try(DirectoryStream<Path> dir = Files.newDirectoryStream(Paths.get(path),
"*.{jpg, png, gif}")) {
int y = 50;
for(Path p : dir) {
Image img =
Toolkit.getDefaultToolkit().getImage(p.toString());
im.add(img);
y += 140;
}
panel.setPreferredSize(new Dimension(250, y+15));
jsp.revalidate();
ci = new Item[20];
System.out.println(" ci[0] = null - pierwsze dodanie");
y = 50;
for(int i = 0; i < 20; i++) {
System.out.println("Dodanawanie pierwsze " + i + " z "
+ maxy);
ci[i] = new Item(im.get(i));
ci[i].setLocation(0, y);
panel.add(ci[i]);
y += 140;
}
}
catch(IOException io) { System.out.println("io " + io); }
}
}
});
add(butt);
setVisible(true);
}
private void showItems(int item) {
maxy = item+20;
System.out.println("Nowe maxy - " + maxy);
for(int i = item, y = (item*140)+50, j = 0; j < 20; i++, j++) {
System.out.println("Dodano " + i + " z " + maxy);
ci[j].setImage(im.get(i));
ci[j].setLocation(0, y);
y += 140;
}
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainWindow();
}
});
}
}
...i kod klasy Item:
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
class Item extends JComponent {
int height, width, rwidth; //rwidth - szerokość rzeczywista
Image img;
Item(Image img) {
this.img = img;
setSize(280, 160);
ImageIcon ic = new ImageIcon(img);
height = ic.getIconHeight();
rwidth = ic.getIconWidth();
ic = null;
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 50, 20, (100 * rwidth) / height, 100, this);
}
public void setImage(Image img) {
this.img = img;
repaint();
}
}
Moglibyście nakierować mnie jak to naprawić? ;) Będę wdzięczny!