Rysowanie na komponencie

Odpowiedz Nowy wątek
2014-04-13 16:59

Rejestracja: 8 lat temu

Ostatnio: 4 miesiące temu

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).

Pozostało 580 znaków

2014-04-13 17:49
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 miesiąc temu

0

Zainteresuj się ComponentListenerem i jego metodą componentResized.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2014-04-14 05:28

Rejestracja: 11 lat temu

Ostatnio: 2 miesiące temu

Lokalizacja: Polska, Warszawa

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.


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?

Pozostało 580 znaków

2014-04-14 10:49
Moderator

Rejestracja: 13 lat temu

Ostatnio: 6 dni temu

Lokalizacja: Stacktrace

0

Klasa Image ma metodę getScaledInstance:

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

Reszta to już prosta matematyka.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

Pozostało 580 znaków

Odpowiedz

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