konto usunięte

Temat: Swing i problem z wyświetlaniem obrazu

Witam wszystkich. Stawiam pierwsze kroki w Javie i mam pewien kłopot. Jako trening pisze program do obróbki zdjęć. Już na początku mam pewien problem. Otóż wczytuję sobie zdjęcie do JPanelu. Jednak gdy powiekszam okno aplikacji obraz znika. Dodałem instrukcje dodawania obrazu w nadpisanej metodzie paint w klasie rozszerzającej JFrame. To nic nie pomogło chociaż wiem że ta metoda wykonuje się przy zmianie rozmiaru okna.

Klasa tworząca okno i panele oraz klasa wczytująca i wyświetlająca obraz znajdują w oddzielnych plikach.

Domyślam się, że to jest dość powszechny problem wśród początkujących. Co zrobić aby to naprawić?:)

konto usunięte

Temat: Swing i problem z wyświetlaniem obrazu

o ile pamiętam:

http://docs.oracle.com/javase/7/docs/api/java/awt/Comp...
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: Swing i problem z wyświetlaniem obrazu

Karol Miłek:
Dodałem instrukcje dodawania obrazu w nadpisanej metodzie paint w klasie rozszerzającej JFrame.

Po pierwsze obraz powinineś narysować na panelu znajdującym się na frame, nie bezpośrednio na frame.
Po drugie do rysowania danego komponentu używa się funkcji paintComponent(g) nie paint(g)(nadpisanie metody paint powoduje nadpisania całego mechanizmu rysowania).
Po trzecie zawsze przy nadpisywaniu tych metod powinno używać się na początku super.paint(g) lub super.paintComponent(g).

Podsumowując rozszerz JPanel nie JFrame, umieść panel na frame. W panelu nadpisz paintComponent(g). Wywołaj tam super.paintComponent(g), po czym narysuj to co chcesz na obiekcie grafiki. Jeśli to nie zadziała, to niestety nie obejdzie się bez próbki twojego kodu w celu znalezienia przyczyny.

Tutaj masz bardzo obszerny przykład i bardzo wyczerpujące wyjaśnienie dlaczego i jak się to robi:
http://stackoverflow.com/questions/5446396/javax-swing...
Dariusz Wawer:
o ile pamiętam:

http://docs.oracle.com/javase/7/docs/api/java/awt/Comp...

W przypadku zmiany rozmiaru okna swing sam powinien wołać repaint(). Ale oczywiście warto spróbować też repaint na frame jeśli powyższe modyfikacje nie pomogą.

Edit:
Spróbuj setIgnoreRepaint(false) na frame. To wskazuje swingowi żeby nie ignorował eventów z SO, czyli np. zmiana rozmiaru okna:

http://docs.oracle.com/javase/7/docs/api/java/awt/Comp...Marcin Mroczkowski edytował(a) ten post dnia 01.01.13 o godzinie 13:07

konto usunięte

Temat: Swing i problem z wyświetlaniem obrazu

Niedawno próbowałem swoich sił w napisaniu czegoś podobnego, ale stwierdziłem, że skorzystam z szeroko dostępnego open-source :)

konto usunięte

Temat: Swing i problem z wyświetlaniem obrazu

Tu jest kod wczytujący i wyświetlający obraz.

public class ImageManager extends JPanel{
private FileDialog fd;
private BufferedImage image;
public Image imgscaled;
private MyFrame cwin;
private int w,h;
public ImageManager(){}
public ImageManager(FileDialog fd){
super();
this.fd = fd;
}
public void ImageLoad(MyFrame cwin){
this.cwin = cwin;
File imageFile = new File(fd.getDirectory(), fd.getFile());
try{
image = ImageIO.read(imageFile);
Dimension dimension = new Dimension(image.getWidth(), image.getHeight());
cwin.setPreferredSize(dimension);
Dimension d = this.cwin.prawy.getSize();
if(image.getWidth()>d.width){
w = (int) d.width;
}
if(image.getHeight()>d.height){
h = (int) d.height;
}
imgscaled = image.getScaledInstance( w, h, java.awt.Image.SCALE_DEFAULT);
this.cwin.prawy.getGraphics().drawImage(imgscaled, 0, 0, this);
//this.cwin.pack();
//repaint();
} catch (IOException e) {
System.err.println("Blad odczytu obrazka");
e.printStackTrace();
}

}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("Repaint");
this.cwin.prawy.getGraphics().drawImage(imgscaled, 0, 0, this);


}
}
Karol Miłek edytował(a) ten post dnia 01.01.13 o godzinie 14:01
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: Swing i problem z wyświetlaniem obrazu

Dużo jest tutaj do poprawiania i tłumaczenia, ale żeby nie mieszać Ci w głowie innymi zagadnieniami skoncentruje się na istocie problemu.

Przede wszystkim w metodzie paintComponent dostajesz obiekt Graphics w parametrze. To jest właśnie ten obiekt na którym masz rysować. Nie używaj metody getGraphics.

Po wywołaniu:
g.drawImage(imgscaled, 0, 0, this);
zamiast:
this.cwin.prawy.getGraphics().drawImage(imgscaled, 0, 0, this);
obrazek powinien być rysowany za każdym razem.

Twój kod zawiera niestety bardzo dużo innych problemów i przede wszystkim źle używa komponenty swinga. Nie chcę pisać monstrualnego posta zawierającego wszystkie uwagi, bo nie mam niestety czasu na to. Żeby zrobić to całkowicie poprawnie najlepiej przeanalizuj tutorial z gotowymi kodami od samego oracle:
http://docs.oracle.com/javase/tutorial/uiswing/paintin...

konto usunięte

Temat: Swing i problem z wyświetlaniem obrazu

OK, zmieniłem trochę układ klas, sam nie wiem czy dobrze bo to jest mój pierwszy większy program.

Panel, w którym ma zostać wyświetlone zdjęcie umieściłem w oddzielnej klasie dziedziczącej po JPanel i w niej nadpisuje metodę paintComponent(), w której jest instrukcja do wyświetlenia zdjęcia.

Natomiast okno i inne komponenty w drugiej klasie. Ta klasa ładuje do okna pierwszą klase z panelem wyświetlającym zdjęcie.

Czy taka koncepcja jest poprawna?
Marcin Mroczkowski

Marcin Mroczkowski Programista JAVA/JEE

Temat: Swing i problem z wyświetlaniem obrazu

Karol Miłek:
Ta klasa ładuje do okna pierwszą klase z panelem wyświetlającym zdjęcie.

Czy taka koncepcja jest poprawna?

Jeśli przez "ładowanie" rozumiesz utworzenie nowej instancji tego panelu i dodanie do okna (frame) tego panelu używając metody .add to owszem, jest to poprawne podejście. Pamiętaj też o tym, żeby w "paintComponent" używać obiektu grafiki, który dostajesz w parametrze.

Następna dyskusja:

Problem z Web Service




Wyślij zaproszenie do