Moin,
ich bin momentan am überlegen wie ich mein Programm "umdesigne", weil es so wie es jetzt ist nicht hundertprozentig funktioniert. Ich möchte ein Programm erstellen, welches mir Bilder von einer Seite herunterlädt, weshalb es einmal einen Crawler gibt der den html-Quelltext nach den entsprechenden Stellen durchsucht und es soll eine GUI geben, über die der Anwender die heruntergeladenen Bilder sofort sieht.
Nur steh ich jetzt aufn Schlauch wie ich das vernünftig umsetzen kann.
Momentan hab ich mehr oder weniger drei Klassen: Gui, Controller und Crawler.
Die Controller-Klasse beinhaltet die Mainklasse und ruft sofowohl die Gui als auch den Crawler auf:
Der Crawler durchsucht die entsprechenden Seiten und speichert die gefundenen Bilder als ImageIO in einer ArrayList. Zum Testen probier ichs gerade lokal auf der HDD:
Die Gui, in der eine JList mit den Bilder dargestellt wird/werden soll. Es funktioniert prinzipiell schon, halt nur ohne Thread:
Wie kann ich es jetzt am besten lösen, dass die Gui angezeigt wird und im Hintergrund die Bilder geladen werden und sobald ein neues Bild geladen wurde, die JList erweitert wird?
ich bin momentan am überlegen wie ich mein Programm "umdesigne", weil es so wie es jetzt ist nicht hundertprozentig funktioniert. Ich möchte ein Programm erstellen, welches mir Bilder von einer Seite herunterlädt, weshalb es einmal einen Crawler gibt der den html-Quelltext nach den entsprechenden Stellen durchsucht und es soll eine GUI geben, über die der Anwender die heruntergeladenen Bilder sofort sieht.
Nur steh ich jetzt aufn Schlauch wie ich das vernünftig umsetzen kann.
Momentan hab ich mehr oder weniger drei Klassen: Gui, Controller und Crawler.
Die Controller-Klasse beinhaltet die Mainklasse und ruft sofowohl die Gui als auch den Crawler auf:
Java:
public class Controller {
FileCrawler crawler;
Gui gui;
public Controller() {
crawler = new FileCrawler(this);
gui = new Gui(this);
}
/* Hier sind noch "Vermittlerfunktionen" für die Kommunikation zwischen Gui und Crawler */
public void addChangeListener(ImageChangeListener listener) {
crawler.addChangeListener(listener);
}
public void removeChangeListener(ImageChangeListener listener) {
crawler.removeChangeListener(listener);
}
public static void main(String[] args) {
Controller con = new Controller();
}
}
Der Crawler durchsucht die entsprechenden Seiten und speichert die gefundenen Bilder als ImageIO in einer ArrayList. Zum Testen probier ichs gerade lokal auf der HDD:
Java:
public class FileCrawler {
Controller con;
AbstractHttpClient httpclient;
List<EigenImageThumb> arrImageThumb;
List<EigenImage> arrImage;
private Vector<ImageChangeListener> changeRecipients; // die Liste der Listener!
public FileCrawler(Controller con) {
this.con = con;
changeRecipients = new Vector();
arrImageThumb = new ArrayList<EigenImageThumb>();
arrImage = new ArrayList<EigenImage>();
httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3");
httpclient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
}
/* Viele andere Funktionen die der Übersichtlichkeithalber nicht drin sind */
public void getImageThumbFromPage(String url, String kommentar) throws ClientProtocolException, IOException {
File dir = new File("D:/Programmieren/Workspace/BilderDownload/bilder/");
File[] fileList = dir.listFiles();
InputStream in = null;
for (int i = 0; i < fileList.length; i++) {
in = new FileInputStream(fileList[i].getAbsoluteFile());
EigenImageThumb img = new EigenImageThumb(url, null, in, fileList[i].getAbsoluteFile().toString());
addSomethingToImportantVector(img);
System.out.println(fileList[i]);
}
}
public List<EigenImageThumb> getArrImageThumb() {
return arrImageThumb;
}
public List<EigenImage> getArrImage() {
return arrImage;
}
public void addChangeListener(ImageChangeListener listener) {
changeRecipients.add(listener);
}
public void removeChangeListener(ImageChangeListener listener) {
changeRecipients.remove(listener);
}
public void fireChangeUpdate(ChangeEvent chEv) {
Iterator<ImageChangeListener> recIt = changeRecipients.iterator();
while (recIt.hasNext()) {
((ImageChangeListener) recIt.next()).changeHappened(chEv);
}
}
public void addSomethingToImportantVector(EigenImageThumb object) {
arrImageThumb.add(object);
fireChangeUpdate(new ChangeEvent(arrImageThumb.indexOf(object), ChangeEvent.ADDED, object));
}
}
Die Gui, in der eine JList mit den Bilder dargestellt wird/werden soll. Es funktioniert prinzipiell schon, halt nur ohne Thread:
Java:
public class Gui extends JFrame implements ImageChangeListener {
//Zeigt die geladenen Bilder an
private JList getImageList() {
if (list == null) {
MyListModel model = new MyListModel();
list = new JList(model);
try {
con.getImageThumbFromPage("", null);
} catch (Exception e) {
e.printStackTrace();
}
List<EigenImageThumb> imgArr = con.getArrImageThumb();
Iterator<EigenImageThumb> it = imgArr.iterator();
while (it.hasNext()) {
model.addImage(it.next());
}
// list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
list.setVisibleRowCount(-1);
list.setCellRenderer(new MyCellRenderer());
}
return list;
}
public Gui(Controller con) {
super();
this.con = con;
con.addChangeListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e1) {
e1.printStackTrace();
}
}
initialize();
// pack();
setVisible(true);
}
//Soll den heweiligen Bildernamen in einer JLIst anzeigen
private JList getJList() {
if (jList == null) {
model = new DefaultListModel();
jList = new JList(model);
model.addElement("Test");
}
return jList;
}
//Soll sobald ein neues Bild geladen wurde, den Bildnamen in der JList jList anzeigen.
@Override
public void changeHappened(crawler.ChangeEvent e) {
model.addElement("Bild " + e.getVZImageThumb().getImageURL() + " hinzugefügt.");
}
}
Wie kann ich es jetzt am besten lösen, dass die Gui angezeigt wird und im Hintergrund die Bilder geladen werden und sobald ein neues Bild geladen wurde, die JList erweitert wird?