Problem z wyświetlaniem obrazka

0

Mam taki problem z programem. Utworzyłam program, który ma wyświetlać obrazki i dokonywać zmian na nich. Wszytko byłoby ok, gdyby nie to, że załadowany obrazek nie wyświetla się od razu, a dopiero po kliknięciu na okienko w pasku menu lub zmianę. Czy ktoś mógłby powiedzieć mi, co jest nie tak?
Oto fragment kodu, w którym coś jest źle:

     private void otworzActionPerformed(java.awt.event.ActionEvent evt) {
        File selectedFile = null;
        JFileChooser fileChooser = new JFileChooser(".");
        FileFilter filter1 = new ExtensionFileFilter("JPG and JPEG", new String[]{"JPG", "JPEG", "PNG"});
        fileChooser.setFileFilter(filter1);
        int status = fileChooser.showOpenDialog(null);
        if (status == JFileChooser.APPROVE_OPTION) {
            selectedFile = fileChooser.getSelectedFile();
            obrazek = Toolkit.getDefaultToolkit().getImage(selectedFile.getPath());
            repaint();
        }
    }
0

Może obrazek nie został jeszcze załadowany wtedy, kiedy wywołujesz metodę repaint. Spróbuj użyć MediaTrackera i metody waitForID lub waitForAll. Tutaj znajdziesz opis klasy:
http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/MediaTracker.html

// Edit

Możesz też użyć metody read z klasy javax.imageio.ImageIO, będzie to dużo prostsze: ImageIO.read("img.png");

0

Po pierwsze czym jest "obrazek". Jak widzę tylko przypisujesz referencję, a to obiektom swingowym może nie wystarczyć. Po drugie - jak sądzisz co każesz odmalować za pomocą wywołania repaint()? Po trzecie samo przypisanie pola obiektu nie powoduje, że obiekt dostaje stan invalidate, a tym samym repaint nawet poprawnie na nim wywołany niczego "nowego" nie odmaluje.

0

Zadziałało. Ślicznie dziękuję :)

Należało dopisać:

 File selectedFile = null;
        JFileChooser fileChooser = new JFileChooser(".");
        FileFilter filter1 = new ExtensionFileFilter("JPG and JPEG", new String[]{"JPG", "JPEG", "PNG"});
        fileChooser.setFileFilter(filter1);
        int status = fileChooser.showOpenDialog(null);
        if (status == JFileChooser.APPROVE_OPTION) {
            selectedFile = fileChooser.getSelectedFile();
        try {
                obrazek = ImageIO.read(fileChooser.getSelectedFile());
            }  catch (IOException e1) {
                e1.printStackTrace();
            }
            repaint();

Mam jeszcze jedno pytanie. Okienko do wyświetlania i modyfikowania obrazów składa się z dwóch paneli. Kiedy otworze jakiś obraz i go zmodyfikuję, obraz zmieniony pojawia się w drugim okienku, w pierwszym jest obraz orginalny. Jednak jeśli otworzę jakiś inny obraz, to wersja zmodyfikowana poprzedniego obrazka nadal jest wyświetlana. Jest jakas metoda na to żeby wyczyścić panel ze zmodyfikowanym obrazem przy otwieraniu innego obrazka?
I wybaczcie, moje programowanie jest raczej toporne.

0

Jeżeli masz BufferedImage img, modifiedImg, to po załadowaniu nowego obrazka możesz przypisać null do modifiedImg, a w metodzie paint sprawdzać, czy ta zmienna ma wartość null. Jeżeli nie, to rysujesz obrazek, jeżeli jest nullem, to odmalowujesz tło. W ten sposób po załadowaniu nowego obrazu i wywołaniu repaint dla drugiego panelu, ten zostanie wyczyszczony.

Możesz też wprowadzić odpowiednią flagę typu boolean. Np. boolean shuldPaintModifiedImg. Po wprowadzeniu flagi podobnie jak w poprzednim przypadku sprawdzasz jej stan w metodzie paint i albo rysujesz obraz, albo tło.

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