Rysowanie na komponencie

0

Mam do wyświetlenia obrazek w JFrame ale potrzebuje też by ten obrazek zmieniał swój rozmiar proporcjonalnie do okna.
Kod do wyświetlenia obrazka.

import java.awt.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Obrazek extends JPanel{

	Image img;
	int x = 0, y = 0;
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		File plikObrazka = new File("D:/PPJ/Proba/src/pjwstk.jpg");
		try {
            img = ImageIO.read(plikObrazka);
        } catch (IOException e) {
            System.err.println("Blad odczytu obrazka");
            e.printStackTrace();
        }
		g.drawImage(img, x, y, null);
	}
	
	public Dimension getPreferredSize(){
        return new Dimension(400, 400);
    }
	
public static void main(String [] args){
		
		JFrame frame = new JFrame("Rysowanie ");//utworzenie okna ramowego
        Obrazek graph  = new Obrazek(); //utworzenie panelu do rysowania
        frame.getContentPane().add(graph); //dodanie panelu do okna ramowego
        frame.setLocation(100, 100); //lokalizacja okna na ekranie
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //obsługa zamkniecia okna
        frame.setPreferredSize(null);
        frame.pack(); //upakowanie okna
        frame.show(); //wyswietlenie okna na ekranie
		
	}
}

To samo tyczy się rysowanych figur za pomocą np. drawRect itd... by one także zmieniały swój rozmiar w zależności od rozciągania okienka.
Użycie getWidth(), getHeight() w metodach rysujących nie rozwiązuje problemy gdyż jeżeli współrzędne początkowe nie są na 0,0 to ucina dalszą część figury (nie widać jej niezależnie od rozmiaru okna, przydało by się jakieś skalowanie).

0

Zainteresuj się ComponentListenerem i jego metodą componentResized.

1

Jedna uwaga. Nigdy, ale to nigdy nie używaj operacji plikowych w metodach rysujących. A ogólnie niczego co może wywalać wyjątki . Można ewentualnie złapać wyjątki w niektórych przypadkach gdy w samej metodzie rysującej da się szybko określić jak to naprawić. Generalnie jednak tak nie jest.
Podobna sytuacja jest w przypadku dużych przydziałów pamięci przez new lub fabryki - generalnie powinno się tego bardzo unikać gdyż skutkiem jest pogorszona reaktywność całego GUI. A nic tak użytkownika nie wścieka jak sypiąca się wydajność w interfejsie.
Metody z grupy paint powinny rysować gotowe grafiki na obliczonych już wcześniej współrzędnych (to dotyczy też grafik wektorowych) oraz istniejące, całkowicie wczytane do pamięci obrazki bitowe. Jedyne obliczenia jakie powinny tam występować, to proste przeliczenia współrzędnych zależne od gotowych już danych.

0

Klasa Image ma metodę getScaledInstance:

scaledInstance = image.getScaledInstance(frame.getWidth(), frame.getHeight(), Image.SCALE_SMOOTH);

Reszta to już prosta matematyka.

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