PDA

View Full Version : Help! showDocument() in java - programmazione desktop e non web!!!


salvo_84
02-12-2006, 19:23
Ragazzi ho un grosso problema che non riesco a risolvere...
sto ultimando un programmino desktop ad interfaccia grafica sviluppato tutto in java con l'ausilio di netbeans, ma sul più bello mi sono bloccato...
ho inserito in una Jlabel un'immagine e ora vorrei che quest'immagine al click del mouse mi apra il mio broswer predefinito e vada sul mio sito che gli ho settato ma non funziona!
Posto un pò di codice:
la classe che dovrebbe far ciò l'ho creata come applet per richiamare poi la funzione in oggetto e ho scritto:

public class ClasseApplet extends java.applet.Applet implements AppletContext {
public void init() {
try{
showDocument(new URL("http://www.google.it"), "_blank");
}catch (Exception e) {
System.out.println("Erroe url");
}
}

public Applet getApplet(String name) {
return null;
}

public Enumeration<Applet> getApplets() {
return null;
}

public void showDocument(URL url) {
}

public void showDocument(URL url, String target) {
}

public void setStream(String key, InputStream stream) throws IOException {
}

public InputStream getStream(String key) {
return null;
}

public Iterator<String> getStreamKeys() {
return null;
}
}


ovviamente questo applet è richiamato da un'altra classe, o meglio da un Jpanel che è contenuto in un Jframe.
Nel Jpanel ho fatto una semplice chiamata a "new ClasseApplet()" in corrispondenza dell'evento generato dal mouse sull'immagine, e che sono sicuro funziona in quanto con il clik del mouse mi sono messo un log di stampa.
Ora non capisco perchè l'applet non mi apre la pagine web, il problema sta in ClasseApplet ma non capisco dove...

Sinceramente non vorrei che stia facendo un errore di fondo, ossia, non è che per caso tutto ciò si può fare solo in applicazioni web e non in applicazioni desktop??

Qualcuno mi aiuti...grazie!! :rolleyes:

PGI-Bis
02-12-2006, 22:25
Le intenzioni sono comprensibili ma per un milione di ragioni la cosa che hai scritto non funziona (cosa che già sai).

Java 6 ancora non c'è, altrimenti l'apertura della pagina web sarebbe:

desktop.browse(new URL("http://www.google.it"));

Prima puoi fare una cosa del genere. Quanto devi aprire la pagina web scrivi:

new SystemProtocolHandler().openAddress("http://www.google.it"));

E SystemProtocolHandler lo devi fare. In tre fette, potrebbe essere:

public interface FileProtocolHandler {

void openAddress(String urlAddress);
}

//Ne serve uno per Win, uno per Linux, uno per Max, uno per Solaris...
public class WinProtocolHandler implements FileProtocolHandler {

public void openAddress(String address) {
ProcessBuilder pb = new ProcessBuilder(
"rundll32",
"url.dll,FileProtocolHandler",
address);
try {
pb.start();
} catch(java.io.IOException ex) {
ex.printStackTrace();
}
}
}

public class SystemProtocolHandler implements FileProtocolHandler {
private FileProtocolHandler forwardingInstance;

public SystemProtocolHandler() {
String os = System.getProperty("os.name");
if(os.toLowerCase().contains("windows")) {
forwardingInstance = new WinProtocolHandler();
}
}

public void openAddress(String urlAddress) {
if(forwardingInstance != null) {
forwardingInstance.openAddress(urlAddress);
}
}
}

salvo_84
02-12-2006, 22:41
volendo io distribuire la mia applicazione su internet, e non sapendo a priori chi la userà (ossia quale utente, se win, unix, os, ...)
mi stai dicendo che faccio prima a rinunciare perchè l'impresa è così ardua che sembrerebbe impossibile?? :confused:

PGI-Bis
02-12-2006, 22:50
Lasciar perdere...mmhhh, vedrò di dare un'occhiata al vocabolario dopo per capire che significa :D.

Puoi anche usare le librerie JDIC.

https://jdic.dev.java.net/

Anzi, forse è anche meglio. In pratica è quella faccenda del "desktop" di Java 6, per le versioni precedenti.

salvo_84
02-12-2006, 22:57
ti ringrazio innanzi tutto per le risposte che mi stai dando, però ti prego non parlare troppo complicato, in quanto sono pur sempre al mio prima programma ;)

salvo_84
03-12-2006, 17:37
Ovviamente il mio programma continua ad essere inerte al comando!!!! :muro:

ho scritto questo in corrispondenza della label che contiene il mio banner:

jLabelBanner.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent me){
apri(new Apri(){
public void open(){
try{
Desktop.browse(new URL("http://www.securitywireless.info/index.html"));
}catch (Exception e){
System.out.println("errore");
}
}
});
};
});


jLabelBanner.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

ma nulla continua a non fuzionare...come mai?? qualcuno sa darmi una dritta :banned:

PGI-Bis
03-12-2006, 17:40
Subito dopo la parentesi graffa del try scrivi:

System.out.println("NONNA!");

ricompila, esegui e clicca sull'etichetta. Sulla console (prompt del dos) compare la scritta "NONNA!" ?

salvo_84
03-12-2006, 17:45
bhè se la tua domanda era riconducibile al fatto se entrasse o meno nel blocco try....bhè....nn entra :-(

salvo_84
03-12-2006, 17:51
Wow!!!
ce l'ho fatta!!!
ho creato una nuova classe "AzioneConnetti" e nel mouseClicked(), il metodo che intercetta il click del mouse sulla label ho inserito semplicemente:
new AzioneConnetti();

la nuova classe l'ho fatta così:


import java.net.URL;
import org.jdesktop.jdic.desktop.Desktop;

public class AzioneConnetti {

public AzioneConnetti() {
postInizializza();
}

private void postInizializza() {
try{
Desktop.browse(new URL("http://www.google.it"));
System.out.println("ciauzzz");
}catch (Exception e){
System.out.println("errore");
}
}
}

ora la mia domanda è:
ma devo fare in modo che la classe sollevi qualche eccezione visto ke non l'ho fatto??
e poi non vedo l'utilità del blocco try/catch visto che sono io a inserire in manuale l'url....non si potrà mai verificare un eccezione sull'url, giusto??

PGI-Bis
03-12-2006, 18:14
Visto, potenza del "metodo della nonna"! :D

Quel blocco try-catch cattura un tot di eccezioni, di tipi diversi. Tra queste ce n'è una di cui non puoi dire "è impossibile che si verifichi". Tale eccezione è la IOException prodotta da Desktop.browse nel caso in cui non sia individuabile il browser predefinito o la richiesta di apertura della pagina tramite il programma browser predefinito generi un qualche errore. Il controllo di chi sia il browser predefinito è nella mani dell'utente sul proprio sistema: nulla vieta che l'utente usi come browser predefinito una chiavica di programma che appena gli passi l'url manda a ramengo tutto quanto.

La teoria generale delle eccezioni in auge oggi dice che devi rilasciare un'eccezione quando ti pare o piace. Se ti pare o piace, rilasciala, se no trattienila.

Personalmente ritengo che questa teoria sia una cialtronata ma tra quello che penso e quello che si fa c'è un'abisso in cui non vorrei coinvolgerti :D.