Odświeżenie zawartości Frame

0

Witajcie,

dopiero zaczynam przygodę z Javą i nawet mi fajnie wyszła aplikacja na zaliczenie przedmiotu, która pobiera źrodło strony, wyciąga linki zdjęć i wyświetla te zdjęcia. Robię to na stronie www.wallbase.cc/toplist.

Chciałem jednak trochę urozmaicić program i w dodać w menu możliwość przełączenia adresu strony z toplist na random (wallbase.cc/random) i dodać wyszukiwanie fraz (wallbase.cc/search/fraza). Sam mechanizm działa w porządku (jak podmieniam na sztywno linki w kodzie to wyświetla inne zdjęcia).

Problem pojawia się (chyba) w funkcji actionPerformed, po wybraniu jakieś opcji główne okno nie odświeża się z nowymi zdjęciami - zmienna "szukacz" dostała nowego Stringa, ale okno się nie "przemalowało".

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import javax.swing.*;

public class MojeOkno extends Frame implements WindowListener, ActionListener {

    Button btnKoniec;
    Label lblInfo;
    MenuItem menuLos;
    MenuItem menuSzukaj;
    ImageCanvas imgCanvas, img2;
    String strURL, szukacz = "", site;
    ImageDownloader imageDownloader;

    MojeOkno() throws IOException {
        super("Imager");
        setSize(1100, 500);
        //setTitle("Nowa nazwa");
        addWindowListener(this);


        setLayout(new GridLayout(4, 4));

        if (szukacz == "") {
            site = "http://wallbase.cc/toplist";
        } else {
            site = "http://wallbase.cc/" + szukacz;
        }
        java.util.List<String> links = LinksPaser.extractLinks(site);
        for (String link : links) {
            strURL = link;
            add(imgCanvas = new ImageCanvas());
            imageDownloader = new ImageDownloader(imgCanvas);
            imageDownloader.setURL(strURL);
            imageDownloader.start();
        }



        Menu menuPlik = new Menu("Plik");

        menuSzukaj = new MenuItem("Szukaj");
        menuSzukaj.addActionListener(this);
        menuPlik.add(menuSzukaj);

        menuLos = new MenuItem("Losowe");
        menuLos.addActionListener(this);
        menuPlik.add(menuLos);

        MenuItem menuKoniec = new MenuItem("Koniec");
        menuKoniec.addActionListener(this);
        menuPlik.add(menuKoniec);

        MenuBar mb = new MenuBar();
        mb.add(menuPlik);
        setMenuBar(mb);


    }

    public void windowClosing(WindowEvent arg0) {
        System.exit(0);
        //dispose();
    }

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == menuLos) {

            szukacz = "random";
            this.repaint();
            return;

        } else if (e.getSource() == menuSzukaj) {
            SzukajDialog dialog = new SzukajDialog(this);
            if (dialog.czyOk) {
                szukacz = "search/_" + dialog.pobierzTekst() + "_";
            }
            return;
        }

        System.exit(0);

    }
}

Nie wiem dokładnie jak to opisać, mam nadzieję, że ktoś rozumie o co chodzi :)

Jak coś wkleję kod pozostałych klas.

Czy ktoś wie jak zaradzić?

0

tak to wygląda na screenie, po kliknięciu "Losowe" chciałbym, żeby okno się odświeżyło ze zmienną "site=www.walbase.cc/random" a nie www.wallbase.cc/toplist:

https://dl.dropbox.com/u/6184604/skrin.PNG

0

Dlaczego w metodzie actionPerformed() tylko na jednej drodze jest repaint()?

0

mi się jakoś tak wydaje, że samo przypisanie do zmiennej "szukacz" nie wystarczy ;) musisz chyba jednak pobrać obrazki nowe - a stare wywalić ;)

Wyciągnij sobie z konstruktora do jakiejś metody tę część, która odpowiada za parsowanie URLa i dodawanie obrazków. I wywołuj tę metodę: w konstruktorze, po szukaniu... i w ogóle wszędzie, gdzie uważasz, że mają się nowe załadować - bo innym sposobem to raczej się nie załadują ;)

public class MojeOkno extends Frame {
 
    Button btnKoniec;
    Label lblInfo;
    MenuItem menuLos;
    MenuItem menuSzukaj;
    String strURL, szukacz = "", site;
    ImageDownloader imageDownloader;
    java.util.List<ImageCanvas> canvasyWszystkie = new java.util.LinkedList<ImageCanvas>();
 
    MojeOkno() throws IOException {
        super("Imager");
        setSize(1100, 500);
        //setTitle("Nowa nazwa");
 
        setLayout(new GridLayout(4, 4));
 
        // ooo - tutaj tak będzie ;)
        wyswietlObrazki();
  
        Menu menuPlik = new Menu("Plik");
 
        menuSzukaj = new MenuItem("Szukaj");
        menuSzukaj.addActionListener(this);
        menuPlik.add(menuSzukaj);
 
        menuLos = new MenuItem("Losowe");
        menuLos.addActionListener(this);
        menuPlik.add(menuLos);
 
        MenuItem menuKoniec = new MenuItem("Koniec");
        menuKoniec.addActionListener(this);
        menuPlik.add(menuKoniec);
 
        MenuBar mb = new MenuBar();
        mb.add(menuPlik);
        setMenuBar(mb);
    }
    
    // o - tutaj jest kod wyciągnięty z konstruktora
    public void wyswietlObrazki() {
        // tu wywalamy stare canvasy, które są zapamiętywane w liście ;)
        for(ImageCanvas canvas : canvasyWszystkie) {
            remove(canvas);
        }
        canvasyWszystkie.clear(); // i czyścimy tę listę
        
        // dodajesz nowe, swoją metodą
        if (szukacz == "") {
            site = "http://wallbase.cc/toplist";
        } else {
            site = "http://wallbase.cc/" + szukacz;
        }
        java.util.List<String> links = LinksPaser.extractLinks(site);
        for (String link : links) {
            strURL = link;
            ImageCanvas canvas = new ImageCanvas();
            // różnica tylko tutaj - zapamiętujemy te canvasy sobie w liście. żeby dało się je wywalić potem
            canvasyWszystkie.add(canvas);
            add(canvas);
            imageDownloader = new ImageDownloader(imgCanvas);
            imageDownloader.setURL(strURL);
            imageDownloader.start();
        }
 
    }
 
    public void windowClosing(WindowEvent arg0) {
        System.exit(0);
        //dispose();
    }
 
    public void actionPerformed(ActionEvent e) {
 
         if (e.getSource() == menuLos) {
             szukacz = "random";
            // tutaj rusza całe ładowanie obrazków
            wyswietlObrazki();
            return;
 
        } else if (e.getSource() == menuSzukaj) {
            SzukajDialog dialog = new SzukajDialog(this);
            if (dialog.czyOk) {
                szukacz = "search/_" + dialog.pobierzTekst() + "_";
                // tutaj rusza całe ładowanie obrazków
                wyswietlObrazki();
            }
            return;
        }
 
        System.exit(0);
 
    }

}

tak mi się jakoś zdaje przynajmniej, że inaczej to nie przejdzie ;) kod przerabiany w rękach, żeby pokazać tylko 'co i jak' - to się pewnie nawet nie skompiluje, bo gdzieś jakieś literówki są, ale ideę chyba łapiesz ;)

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