Innanzitutto ti ringrazio per la pazienza e la gentilezza

Ho creato il metodo per cambiare lo stato del bottone, mettendo private a btnStart.

Ora, il tuo codice è parecchio ridondante: non c'è nessuna necessità di avere un riferimento named all'oggetto "this". "this" è già più che sufficiente di per sé.

Quando da una classe voglio passare un riferimento a me stesso, uso appunto this:
codice:
new Crawler( this );
Avevo agito in questo modo perchè lo passavo in un ActionListener, quindi non mi vedeva l'oggetto Main, ma ActionListener. Ho però aggiustato come hai detto tu, spostando il passaggio, e ponendolo nel metodo che passa tutti i dati alla classe Crawler...cosa molto più ovvia


1) Come si chiama il pulsante (lo si può intuire, ma non ne siamo sicuri)
Il pulsante si chiama btnStart

2) Dove e quando viene creato questo pulsante nella classe Main
Il pulsante viene creato nel costruttore della classe Main, così come tutta l'interfaccia grafica. Questo costruttore viene chiamato nella stessa classe dal main, creando un oggetto e settando visible.

3) Dove e quando viene usato dalla classe Crawler
La mia idea è farlo utilizzare alla fine di un metodo della classe Crawler - end() -, che viene chiamato quando non ci sono più pagine da visitare, quindi è finita la sessione di crawling e scrive il report su di un file. Di fatto quando finisce la "sessione" del programma.

4) Dove viene generata quell'eccezione perchè non hai postato lo stackTrace completo che ti dice il nome del file e la riga dove quella eccezione viene sollevata)
L'eccezione si verificava all'interno del metodo che ti ho citato sopra, in corrispondenza dell'utilizzo dell'oggetto Main che passo alla classe Crawler, quindi in corrispondenza di
codice:
            framePrinc.setButtonEnabled();
dove setButtonEnabled è il metodo setter che ho appena creato sotto tuo consiglio, e framePrinc viene settato tramite il costruttore che ho aggiunto
codice:
   public Crawler (Main main) {
	   framePrinc=main;

   }
con framePrinc così definito
codice:
    private Main framePrinc;
Lo stackTrace incriminato è
codice:
Exception in thread "Esploratore 0" java.lang.NullPointerException
	at Explorer.Crawler.end(Crawler.java:102) // qui è dove chiamo framePrinc.setButtonEnabled
	at Explorer.Crawler.addPaginaVisitata(Crawler.java:143)
	at Explorer.Crawler.getPaginaDaVisitare(Crawler.java:208)
	at Explorer.PageExplorer.run(PageExplorer.java:45)