silveira neto

carbon-based lifeform. virgo supercluster

Menu Close

JavaFX, Acessando Recursos de Dentro do JAR

us flagTranslation: there’s a English version of this article.

Para algumas classes como o javafx.scene.image.Image é fácil abrir imagens de uma localidade remotada com:

ImageView {
    image: Image {
        url: "http://example.com/minhaFigura.png"
    }
}

ou uma imagem local com a constante __DIR:

ImageView {
    image: Image {
        url: "{__DIR__}/minhaFigura.png"
    }
}

Mas para outras classes abrir recursos internos (de dentro do próprio arquivo jar) não é tão direto. Por exemplo, no artigo Parsing a XML Sandwich with JavaFX eu tive que colocar o arquvio XML dentro de um diretório temporário. Uma maneira mais elegante teria sido:

package handlexml;
 
import java.io.FileInputStream;
import javafx.data.pull.*;
import javafx.ext.swing.*;
import javafx.scene.Scene;
import javafx.stage.Stage;
 
class Resource{
    function getUrl(name:String){
        return this.getClass().getResource(name);
    }
 
    function getStream(name:String){
        return this.getClass().getResourceAsStream(name);
    }
}
 
var list = SwingList { width: 600, height: 300}
 
var myparser = PullParser {
    documentType: PullParser.XML;
    onEvent: function (e: Event) {
        var item = SwingListItem {text: "event {e}"};
        insert item into list.items;
    }
    input: Resource{}.getStream("my.xml");
}
myparser.parse();
 
Stage {
    title: "Map"
    scene: Scene {
        content: list
    }
}

Com um simples arquivo XML chamadovmy.xml dentro do seu pacote.

<?xml version="1.0" encoding="UTF-8"?>
<bread sesame="true">
   <catchup/>
   <hamburguer/>
   <cheese type="chedar"/>
   <maionese/>
   <lettuce/>
</bread>

fileplace

E temos os mesmos resultados de antes, mas com todos seus aquivos dentro de seus Jars.

Referencias:

© 2016 silveira neto. All rights reserved.

Theme by Anders Norén.