Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [Java e JavaFX] Come "lanciare" javafx da java

    Buongiorno a tutti ragazzi,
    purtroppo per lavoro sono dovuto tornare sull'interoperabilità tra java e javafx.
    il problema è il seguente:
    Devo far riprodurre a java, tramite javafx, dei video in rotazione. fin qui nessun problema, ho il link o i link dei video e li sparo a java fx, tramite una interfaccia. qua sotto vi posto il codice:

    metodo che "manda" i link e posizione e dimensione del video:
    codice:
    public static void vediSingoloVideo(int audio,String arrayVideo,int posx,int posy,int larg,int alt){        
            //JavaTestSV jt = new JavaTestSV();
            //jt.eseguiSingoloVideo(audio, arrayVideo, posx, posy, larg, alt);
            Context context = FXLocal.getContext();
            FXClassType instance = context.findClass("provavideo.Main");
            ObjectValue obj = (ObjectValue)instance.newInstance();
            InterfaceJavaSV ji = (InterfaceJavaSV)obj.asObject();
            //ji.addVideo(audio,arrayV,larg,alt);
            ji.mostra(audio,arrayVideo,posx,posy,larg,alt);
        }
    questo si collega a InterfaceJavaSV, presente in un jar da me creato. questa classe è cosi composta:
    InterfaceJavaSV.java
    codice:
    package provavideo;
    
    public interface InterfaceJavaSV {
        //public void addVideo(int audio,String array,int larg,int alt);
        public void mostra(int audio,String array,int posx,int posy,int larg,int alt);
    }
    e l'ultima classe che uso per rappresentare il video è questa:
    Main.fx

    codice:
    package provavideo;
    
    import javafx.scene.media.Media;
    import javafx.scene.media.MediaPlayer;
    import javafx.scene.media.MediaView;
    import javafx.scene.media.MediaError;
    import javafx.stage.*;
    import javafx.scene.*;
    import provavideo.InterfaceJavaSV;
    
    class Main extends InterfaceJavaSV {
        var x;
        var y;
        var w;
        var h;
        var aud;
        var film;
    
        public override function mostra(audio:Integer,video:String,posX: Integer,posY: Integer,larg: Integer,alt: Integer) : Void {
             x = posX;
             y = posY;
             w = larg;
             h = alt;
             aud = audio;
             film = video;
             Stage {
                title: ""
                style: StageStyle.TRANSPARENT
                resizable:true
                x:x
                y:y
                width:w
                height:h
                scene: Scene {                
                    content: [
                            if(aud == 0){
                                MediaView{
                                    smooth:false
                                    preserveRatio:false
                                    cache:true
                                    fitWidth: w
                                    fitHeight:h
                                    disable:false
                                    mediaPlayer:MediaPlayer{
                                        mute:true
                                        media:Media{
                                                onError: function(e:MediaError) {
                                                    println("Media error {e}");
                                                }
                                                source:film
                                              }
    
                                        autoPlay:true
                                        repeatCount:MediaPlayer.REPEAT_FOREVER
                                    }
                                }
                            }
                            else{
                                MediaView{
                                    smooth:false
                                    preserveRatio:false
                                    cache:true
                                    fitWidth: w//larg
                                    fitHeight: h//alt
                                    disable:false
                                    mediaPlayer:MediaPlayer{
                                        mute:false
                                        volume:1.0
                                        media:Media{
                                                onError: function(e:MediaError) {
                                                    println("Media error {e}");
                                                }
                                                source:film
                                              }
                                        autoPlay:true
                                        repeatCount:MediaPlayer.REPEAT_FOREVER
                                    }
                                }
                            }
                    ]
                }
            }
        }
    }
    Ora, il tutto su netbeans funziona, ma da prompt mi genera il seguente errore:
    codice:
    Microsoft Windows XP [Versione 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.
    
    C:\Documents and Settings\user>cd C:\Documents and Settings\user\Desktop\Test Mo
    nitor 22-03-2010
    
    C:\Documents and Settings\user\Desktop\Test Monitor 22-03-2010>java EasyMonitor
    Exception in thread "Thread-3" java.lang.NoClassDefFoundError: javafx/stage/Stag
    e
            at provavideo.Main.mostra(Main.fx:27)
            at MonitorObj.vediSingoloVideo(MonitorObj.java:231)
            at MyTimerTask.disegnaMonitor(EasyMonitor.java:2198)
            at MyTimerTask$1.run(EasyMonitor.java:3872)
            at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.ClassNotFoundException: javafx.stage.Stage
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            ... 5 more
    
    C:\Documents and Settings\user\Desktop\Test Monitor 22-03-2010>
    Perchè? il classpath contiene tutti i puntamenti necessari.. aiutooooo!!!

  2. #2
    Allora aggiungo qualche novità magari aiuta.. ho trovato un altro modo per raggiungere la classe Main.fx, che mi fa saltare parecchi passaggi, riconducendo il tutto ad una forma del tipo:

    codice:
    Main m=new Main();
    m.nomeMetodo(parametri);
    e infatti non mi segnala errori in questo, ma rimane quello sopra citate.. non trova javafx\stage\Stage.. ma come è possibile?? gli import ci sono tutti, i jar sono tutti nel classpath.. idee?
    Non credo sia impossibile chiamare javafx da java fuori da netbeans...

  3. #3
    sono riuscito a trovare una soluzione finalmente!! ora però mi presenta un altro problema.. qualcuno saprebbe indicarmi un metodo per la riproduzione di una playlist di video (in JavaFX) senza dovermi rifare al MediaBox?
    Grazie..

  4. #4
    Ciao,

    mi sto cimentando sempre di più con questo JavaFX, da quando mi hai risposto all'altro post.
    Mi sono accorto che, in modo estremamente semplice, è possibile realizzare un disco rosso che "lampeggia", tramite JavaFX. Siccome in un altro thread avevo questa necessità, e volevo risolvere il tutto usando una semplice gif animata all'interno di una JLabel (con scarsi risultati), ho pensato di risolvere il problema, a questo punto, con JavaFX.
    Mi sembra di capire che in questo thread tu abbia lo stesso problema che ho io ora.
    La classe è questa:
    codice:
    package scene;
    
    import javafx.stage.Stage;
    import javafx.scene.Scene;
    import javafx.scene.shape.Circle;
    import javafx.scene.paint.Color;
    import javafx.scene.paint.RadialGradient;
    import javafx.scene.paint.Stop;
    import javafx.animation.Timeline;
    import javafx.animation.KeyFrame;
    import javafx.animation.Interpolator;
    
    var radius = 15;
    Timeline {
        repeatCount: Timeline.INDEFINITE,
        keyFrames: [
            KeyFrame {
                time: 0.5s,
                canSkip: true
                values : [
                    radius => 5 tween Interpolator.EASEBOTH
                ]
            } // KeyFrame
            KeyFrame {
                time: 1.0s,
                canSkip: true
                values : [
                    radius => 15 tween Interpolator.EASEBOTH
                ]
            } // KeyFrame
    	] // keyFrames
    }.play(); // Timeline
    Stage {
        title : "Alert"
        scene: Scene {
            width: 30
            height: 30
            content: [
    	        Circle {
    	            centerX: 15,
    	        	centerY: 15,
    	            radius: bind radius
    	            fill: Color.RED
    			} // Circle
    		] // content
    	} // Scene  
    } // Stage
    Vorrei inserire questo pallino rosso che lampeggia in un JPanel, ma facendo come dice qui, non funziona.
    L'errore che ottengo sempre è questo:
    codice:
    Exception in thread "main" java.lang.NoClassDefFoundError: javafx/reflect/FXClassType
    	at gui.MyFrame.getJContentPane(MyFrame.java:42)
    	at gui.MyFrame.initialize(MyFrame.java:29)
    	at gui.MyFrame.<init>(MyFrame.java:19)
    	at Main.main(Main.java:6)
    Caused by: java.lang.ClassNotFoundException: javafx.reflect.FXClassType
    Tu come hai risolto poi?

  5. #5
    allora la soluzione è piuttosto semplice, lui ti avverte che manca una classe, che per l'appunto è situata in:
    codice:
    javafx/reflect/FXClassType
    io per ovviare a questo problema ho preso la cartella javafx che contiene la cartella reflect e di conseguenza la classe FXClassType e la ho allegata al progetto! se hai installato netbeans con il tool per javafx nel percorso standard, dovresti trovare questa cartella in:
    codice:
    C:\Programmi\NetBeans 6.8\javafx2\javafx-sdk\src
    vi è una cartella chiamata per l'appunto javafx con dentro tutto quello che ti serve^^ basta copiare la cartella all'interno della cartella dove hai il tuo progetto! se ti servono altre info sono qua^^

  6. #6
    Ciao!

    Scusa se mi rifaccio vivo solo adesso ma sono stato fuori per lavoro..

    Ho provato a includere nel progetto quella directory (/opt/javafx-sdk1.2/src/javafx/reflect), nella quale ci sono i seguenti files:
    codice:
    FXBooleanValue.java      FXContext.java         FXFunctionType.java   FXLocal.java         FXMember.java          FXSequenceBuilder.java  FXValue.java
    FXChangeListenerID.java  FXDoubleValue.java     FXFunctionValue.java  FXLocation.java      FXObjectValue.java     FXSequenceType.java     FXVarMember.java
    FXChangeListener.java    FXFloatValue.java      FXIntegerValue.java   FXLongValue.java     FXPrimitiveType.java   FXSequenceValue.java    FXVarMemberLocation.java
    FXClassType.java         FXFunctionMember.java  FXJavaArrayType.java  FXMemberFilter.java  FXPrimitiveValue.java  FXType.java             package-info.java
    Io uso Eclipse, e ho incluso nel progetto quella directory. Effettivamente ora non da più quell'errore ma non parte proprio il programma. Sicuramente sbaglio qualcosa, ma cosa?

  7. #7
    Ok, penso di aver risolto quella questione.
    Ho preso i sorgenti e li ho messi nel package in cui si aspetta che siano.
    Ora però ho un problema simile, ovvero:
    codice:
    Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/javafx/tk/swing/SwingScene$SwingScenePanel
    Solo che quella classe non la trovo e la directory tk non è nel mio percorso com/sun/javafx.

  8. #8
    Ehila scusami se rispondo solo ora ma anche io ho avuto un pò da fare!
    allora l'errore è "semplice" non trova la classe SwingScene$SwingScenePanel! a me da errori simili con altri package e sinceramente non capisco dove sia l'errore! però solo dal prompt perchè da netbeans mi funge! non ho mai usato eclipse quindi non sò aiutarti in questo senso! tu sai per caso come si crea una playlist di video con javafx?

  9. #9
    Eh, l'avevo capito che non trova quella classe
    solo che non so come dargliela in pasto. O meglio, non so dove andarla a pescare. C'è qualche libreria che la contiene ma non saprei quale. Potresti guardare da Netbeans che librerie importi per quel progetto?

    Per la playlist mi dispiace, purtroppo quelle pochissime cose che so di javafx le ho viste da te, ed ho cominciato da pochissimo a metterci le mani!

  10. #10
    Il problema è che io sto caricando l'animazione nel seguente modo:
    codice:
    jContentPane.add(LoadScene.loadScene("Animazione"), BorderLayout.CENTER);
    dove il jContentPane è un JPanel, e la classe LoadScene è questa:
    codice:
    package scene;
    
    import com.sun.javafx.tk.swing.SwingScene;
    import com.sun.scenario.scenegraph.JSGPanel;
    import javafx.reflect.FXClassType;
    import javafx.reflect.FXFunctionMember;
    import javafx.reflect.FXLocal;
    import javafx.reflect.FXLocal.ObjectValue;
    
    public class LoadScene {
        
    	private static FXLocal.Context context = FXLocal.getContext();
    
        public static JSGPanel loadScene(String classname) {
            FXClassType classRef = context.findClass(classname);
            FXLocal.ObjectValue obj = (ObjectValue) classRef.newInstance();
            FXFunctionMember getPeer = classRef.getFunction("impl_getPeer");
            FXLocal.ObjectValue peer = (ObjectValue) getPeer.invoke(obj);
            SwingScene scene = (SwingScene)peer.asObject();
    
            return scene.scenePanel;
        }
    }
    Quindi non sembrerebbe un problema di package mancante, in quanto la classe SwingScene viene risolta, e il package esiste. Quell'errore di prima me lo da proprio sul LoadScene sul JPanel.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.