JavaFX - Creare Slideshow

di il
11 risposte

JavaFX - Creare Slideshow

Buongiorno a tutti,
dire che sono nuovo a javaFX è dir poco, ma mi viene richiesto di creare una webView, visualizzare un'immagine alla volta (tipo slideshow). Attualmente riesco a creare una webview e a visualizzare n immagini, utilizzando il codice seguente:
StringBuilder sb = new StringBuilder();

		String[] imageUrls = {"logo.png","nebbia.jpg"};
		String[] htmlCode = new String[imageUrls.length];
		
		File[] imagefiles = new File[imageUrls.length];
		for (int i = 0; i < imageUrls.length; i++) {
			String filePath = imageUrls[i];
			imagefiles[i] = new File(filePath);
		}
		URI imageUri = null;

		for (int i = 0; i < imageUrls.length; i++) {
			imageUri = URI.create(imageUrls[i]);
			sb.append("<!DOCTYPE html>\n" + "<html>\n"); 
			sb.append("<body>");
			sb.append("<img src = ");
			sb.append(imagefiles[i].toURI());
			sb.append(" width = 20% " + " height = 20%");
			sb.append(">\n");
			sb.append("</body>\n");
			sb.append("</html>");
			htmlCode[i] = sb.toString();
		}

		return htmlCode;
Sorvolando sulla pietosa indentatura, con questo codice visualizzo due immagini, una dopo l'altra, in stile img1 img2. Vorrei visualizzarne una alla volta, in stile, appunto, slideshow. Come posso fare?
Grazie a tutti

11 Risposte

  • Re: JavaFX - Creare Slideshow

    lucad93 ha scritto:


    Attualmente riesco a creare una webview e a visualizzare n immagini, utilizzando il codice seguente:
    Innanzitutto il codice non mi sembra molto corretto ... usi lo stesso oggetto StringBuilder per tutti gli append, quindi in htmlCode[0] ok hai un html completo ma in htmlCode[1] hai 2 pezzi di html completi accodati!!

    Non ho (ancora) conoscenze elevate su JavaFX ma dato che si tratta di una "webview" allora la questione si sposta a livello di tecnologie "client" HTML/CSS/Javascript. Quindi forse faresti meglio a fare un file HTML a parte che puoi testare anche in un browser. Poi lo fai semplicemente caricare alla webview.

    Per la questione dello "slideshow", basta solo un poco di Javascript.
  • Re: JavaFX - Creare Slideshow

    Non funziona javascript nella webview, ho già provato
  • Re: JavaFX - Creare Slideshow

    lucad93 ha scritto:


    Non funziona javascript nella webview, ho già provato
    Javascript funziona nella webview di JavaFX.

    Certe interazioni con l'utente però non sono "automatiche". Ad esempio un window.alert() non è automatico, l'engine lancia un evento che il programmatore deve gestire con un handler registrato con setOnAlert() sul WebEngine. Idem per altre cose (es. il confirm() ). Ed è ben documentato nel javadoc di WebEngine.
  • Re: JavaFX - Creare Slideshow

    Ok, grazie, ora ci sono. Se volessi invece cliccare in un punto della webview e avere un evento? Nel senso, tipo, clicco su A e stampa A, clicco su B e stampa B, tutto a console è possibile?
  • Re: JavaFX - Creare Slideshow

    lucad93 ha scritto:


    Se volessi invece cliccare in un punto della webview e avere un evento?
    Gestirlo a livello Javascript ... o Java? COSA vuoi fare di preciso? ("clicco su A e stampa A, clicco su B e stampa B" cosa sono A e B su cui clicchi??)
  • Re: JavaFX - Creare Slideshow

    Diciamo due immagini: mettiamo ce ne sia una con disegnato un gatto e una con disegnato un cane. Se clicco sul gatto deve stampare a console "gatto", se clicco sul cane analogamente. Nella pagina che mi hai linkato c'è un esempio:
    EventListener listener = new EventListener() {
        public void handleEvent(Event ev) {
            Platform.exit();
        }
    };
    
    Document doc = webEngine.getDocument();
    Element el = doc.getElementById("exit-app");
    ((EventTarget) el).addEventListener("click", listener, false);
    Ma se lo metto in eclipse mi da errore e non funziona (dice in pratica che element non ha un eventlistener)
  • Re: JavaFX - Creare Slideshow

    lucad93 ha scritto:


    Ma se lo metto in eclipse mi da errore e non funziona (dice in pratica che element non ha un eventlistener)
    Innanzitutto dovresti lato Java attendere il caricamento del DOM della pagina. Il load(url) è asincrono, quindi il Document non è "subito" disponibile. Il WebEngine ha il documentProperty(), quindi puoi registrarci un listener. Appena ottieni un Document non-null, allora il DOM è stato caricato.

    A quel punto puoi registrare altro. Quel codice mostrato presume che nella pagina ci sia un elemento con ID "exit-app" (es. un pulsante).
  • Re: JavaFX - Creare Slideshow

    Sulla mia c'è, nel senso che ho un'immagine con id=img. Per intenderci, la mia situazione è questa:
    	public void lanciaTest() throws InterruptedException {
    		String content = buildTest.buildTest()[0];
    		WebEngine engine = web.getEngine();
    		engine.loadContent(content);
    		engine.setJavaScriptEnabled(true);
    		engine.executeScript("function myFunction(){\n" + 
    				"            document.getElementById(\"prova\").innerHTML = \"Prova\";\n" + 
    				"        }");
    		
    		
    		EventListener listener = new EventListener() {
    		    public void handleEvent(Event ev) {
    		        System.out.println("prova");
    		    }
    		};
    
    		Document doc = engine.getDocument();
    		Element el = doc.getElementById("img");
    		if(engine.documentProperty()==true) {
    			((EventTarget) el).addEventListener("click", listener, false);
    		}
    	}
    
  • Re: JavaFX - Creare Slideshow

    lucad93 ha scritto:


    engine.loadContent(content);
    Il loadContent è come il load ... asincrono.

    lucad93 ha scritto:


    engine.setJavaScriptEnabled(true);
    E' già true per default.

    lucad93 ha scritto:


    engine.executeScript("function myFunction(){\n" +
    " document.getElementById(\"prova\").innerHTML = \"Prova\";\n" +
    " }");
    Queste cose in puro Javascript sarebbe meglio se fossero nella pagina HTML (in uno <script> o in un .js referenziato)

    lucad93 ha scritto:


    if(engine.documentProperty()==true) {
    Questo ovvero engine.documentProperty()==true è senza alcun senso, oltre che errato (il documentProperty() non ha nulla a che fare con un boolean).
  • Re: JavaFX - Creare Slideshow

    L'errore originale me lo da qui, però:
    ((EventTarget) el).addEventListener("click", listener, false);
  • Re: JavaFX - Creare Slideshow

    lucad93 ha scritto:


    L'errore originale me lo da qui, però:
    ((EventTarget) el).addEventListener("click", listener, false);
    Un errore di COMPILAZIONE lo hai di certo: engine.documentProperty()==true
Devi accedere o registrarti per scrivere nel forum
11 risposte