drawImage() klasy Graphics - rozmieszczanie obrazków

0

Mam obiekt JPanel któremu za pomocą metody setPreferredSize() ustawiłem rozmiar - width, height. W przeciążonej metodzie setPreferredSize(Graphics g) mam coś takiego:

protected void paintComponent(Graphics g) {
		bufferedImg = scaleImage(bufferedImg, 200, 200); //skaluje wszystkie obrazki z listy bufferedImg do rozmiaru 200x200
		Graphics2D g2d = (Graphics2D) g;
// w petli rysowane są wszystkie obrazki
		for(int i=0; i<bufferedImg.size(); i++) {
			g2d.drawImage(bufferedImg.get(i), 0, 0, null);
		}
	}

Problem w tym, że w pętli rysują się obrazki jeden na drugim i w końcowym efekcie widać tylko ostatni obrazek. Czy da się zrobic w ten sposób żeby obrazki były wyświetlane jeden pod drugim?

0

Przesuwaj pozycję y? :|

0

w zasadzie dla wyświetlania obrazków w 1 kolumnie to jest ok rozwiązanie, ale dla 2 lub 3 kolumn wtedy trzeba byłoby się bawić w przesuwanie y oraz x a to byłoby już trochę trudniejsze

0
protected void paintComponent(Graphics g) {
                final imageInColumn=5; //liczba obrazkow w kolumnie
                bufferedImg = scaleImage(bufferedImg, 200, 200); //skaluje wszystkie obrazki z listy bufferedImg do rozmiaru 200x200
                Graphics2D g2d = (Graphics2D) g;
// w petli rysowane są wszystkie obrazki
                for(int i=0; i<bufferedImg.size(); i++) {
                        int y=i%imageInColumn;
                        int x=i/imageInColumn;
                        BufferedImage img = bufferedImg.get(i);
                        g2d.drawImage(img, x*img.getWidth(), y*img.getHeight(), null);
                }
        }

Pisane z palca wiec nie wiem na bank dobrze działa ;). I skalowanie przerzuć do innego miejsca bo ta metoda ma tylko rysować.

0

dzięki, jednak nie wiem czy z tym całym rysowaniem idę w dobrą stronę, ponieważ w programie ma być możliwość powiększania tych obrazków-miniaturek (200x200) po kliknięciu w wybraną miniaturkę do oryginalnych rozmiarów np. w nowym oknie. Nie znam na tyle Javy, ale wydaje mi sie że będzie problem żeby znaleźć jakiś mechanizm który po kliknięciu w miniaturkę narysowaną w JPanelu wywoła jakiekolwiek zdarzenie (np. te otwarcie okna). Jak zatem rozwiazać problem?

0

Możesz dodać do panelu zawierającego miniaturki mouseListenera. Po kliknięciu łatwo (jeśli ustawisz setResizable(false)) sprawdzić. czy użytkownik trafił w miniaturkę i w którą konkretnie trafił.

0
bogdans napisał(a):

Po kliknięciu łatwo (jeśli ustawisz setResizable(false)) sprawdzić. czy użytkownik trafił w miniaturkę i w którą konkretnie trafił.

Ten łatwy sposób to masz na myśli, sprawdzać pozycję x, y myszki gdzie użytkownik kliknął i na tej podstawie obliczyć, który obrazek został kliknięty?

0

Tak, mam tak w programie.

0

Do rysowania samych miniatur nie musisz zmieniać ich rozmiaru. Użyj przeciążonej metody:

Dokumentacja klasy Graphics napisał(a)

drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
Draws as much of the specified image as has already been scaled to fit inside the specified rectangle.

0

rzeczywiście, skalowanie w takim razie jest mi niepotrzebne. Mam jeszcze inny problem związany też z klasą Graphics. Chodzi mi o narysowanie napisu na przeźroczystym tle na każdej miniaturce. Z narysowaniem napisu nie mam problemu, gorzej z przeźroczystym tłem.
Próbowałem użyć setBackground() i podać jako parametry odpowiedni obiekt klasy Color:

Color transparency = new Color(55, 55, 55);
transparency.getTransparency();

Co zrobić z tym co zwraca getTransparency()?

1 użytkowników online, w tym zalogowanych: 0, gości: 1