Java JSoup, IOException und TimerTask/ScheduledExecutorService

jurrasstoil

Commodore
Registriert
Dez. 2006
Beiträge
4.226
Hey,

ich stehe ordentlich auf dem Schlauch.

Ich versuche mich gerade ein wenig in Java und wollte eigentlich nur ein sehr kleines Programm, das mit der JSoup Bibliothek eine html Seite lädt, ein bestimmtes Attribut eines bestimmten Elements mit einer bestimmten ID checkt und dementsprechend ein JPanel Icon ändert. Das funktioniert auch soweit, allerdings hätte ich gerne, dass dies alle 60s erneut überprüft wird - und daran hakt es.

Code:
import javax.swing.*;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.IOException;


public class MainGUI {
    private JPanel panel;
    private JLabel redgreen;

    public static void main(String[] args) throws IOException {
        JFrame frame = new JFrame("MainGUI");
        frame.setContentPane(new MainGUI().panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public MainGUI() throws IOException {
        ImageIcon red = new ImageIcon("red.png");
        ImageIcon green = new ImageIcon("green.png");
        Document doc = Jsoup.connect("URL").get(); //hier holt er sich die Seite
        Elements available = doc.select("p#ID_des_Elements"); //das zu checkende Element mit der ID
        String attr = available.attr("style"); //das zu checkende Attribut
        if (attr.equals("display:none;")) {
            redgreen.setIcon(red);
        }
        else {
            redgreen.setIcon(green);
        }
    }
}

Ich hab es mit ScheduledExecutorService versucht, doch egal wie ich es gedreht habe kam nichts funktionierendes bei heraus. Dieser benötigt Runnable mit void run(), dann meckert er aber rum das Jsoup.connect eine unhandled Exception hat. run() in der new Runnable() wiederum kann ich aber nicht dazu bewegen das zu tun.
Code:
java: run() in <anonymous com.company.MainGUI$1> cannot implement run() in java.lang.Runnable overridden method does not throw java.io.IOException

Eine while oder for Schleife mit Thread.sleep(60000) hat auch nichts gebracht.

Wäre dankbar für einen Schubs in die richtige Richtung bzw. einen Fingerzeig wo mein Denkfehler und Wissensmangel zu Unvermögen führen.
 
Gibt wie immer eine ganze Reihe von Möglichkeiten. Mal ein paar für dich zum Ausprobieren

Code:
        Timer timer = new Timer(true);
        timer.schedule(new TimerTask() {
            
            @Override
            public void run() {
                // JSoup connect etc.
            }
        }, 0, 5000);
Code:
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        executor.scheduleAtFixedRate(new Runnable() {
            
            @Override
            public void run() {
                // JSoup connect
            }
        }, 0, 5000, TimeUnit.MILLISECONDS);
Selbst bei nicht wiederkehrender Ausführung solltest du das trotzdem keinesfalls im Vordergrund ausführen. Dafür gibt es z.B. sowas:
Code:
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                // JSoup connect etc.
            }
        });

Edit: falls du das mit den Exceptions noch nicht ganz verstanden hast - du musst sie fangen, nicht versuchen mit throws weiterzureichen. try-catch drum und fertig ist der Lack.
 
Zuletzt bearbeitet:
TimerTask wollte nicht aus welchen Gründen auch immer.

ScheduledExecutorService funktioniert aber.

Code:
package com.company;

import javax.swing.*;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class MainGUI {
    private JPanel panel;
    private JLabel redgreen;

    public static void main(String[] args) throws Exception {
        JFrame frame = new JFrame("MainGUI");
        frame.setContentPane(new MainGUI().panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public MainGUI() throws Exception{
        ImageIcon red = new ImageIcon("red.png");
        ImageIcon green = new ImageIcon("green.png");

        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        executor.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                try {
                    Document doc = Jsoup.connect("URL").get();
                    Elements available = doc.select("p#ID_des_Elements");
                    String attr = available.attr("style");
                    redgreen.setText("");
                    if (attr.equals("display:none;")) {
                        redgreen.setIcon(red);
                    } else {
                        redgreen.setIcon(green);
                    }
                } catch (Exception ex) {
                    redgreen.setText("Fehler");
                }
            }
        }, 0, 60000, TimeUnit.MILLISECONDS);
    }
}

Besten Dank.
 
Zurück
Oben