Skip to content

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.



   
   
   
   
   

fileplace

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

Referencias:

Published inportuguês

4 Comments

  1. Viva,

    Conforme pedido por você, aqui deixo o problema que tinha (já o consegui resolver).
    O problema era que tinha uma classe a retornar um group na função create e esse group tinha uns poucos elementos para serem apresentados na “janela”. O problema era que só alguns elementos é que eram desenhados ou então, como ontem acabou por acontecer, nenhum elemento era desenhado. Estes elementos eram declarados no inicio da classe e inicializados através de uma função. A declaração da função era feita mais abaixo no ficheiro.

    Depois de fazer várias experiências falhadas para tentar verificar onde estava o problema, depois de lhe mandar o e-mail a pedir ajuda pus-me a olhar para o código e passei as declarações e inicializações das variáveis para depois das declarações das funções. Feito isto, os elementos começaram logo a ser todos apresentados na janela.

    Apesar de já ter o problema resolvido, agradeço a sua atenção e o facto de me ter respondido ao e-mail.
    No entanto, vou continuar a passar por aqui pois pelos exemplos que você tem no seu blog estes podem vir a ser utéis para o desenvolvimento do meu projecto para a faculdade dado que também vou precisar de criar algumas animações.

    No entanto deixo aqui três perguntas:
    – Existe alguma forma de aceder directamente a um nó através do seu id ou é necessário atribuir esse nó a uma variável e depois aceder por intermédio da variável?
    – Qual é a melhor forma de desenhar uma matriz que depois irá servir como um mapa? (neste momento eu estou a desenhá-la recorrendo a rectângulos)
    – Existe alguma forma de acelerar a inicialização de uma aplicação javafx?
    É que a que eu estou a fazer ainda demora uns 10 a 20 segundos a ser lançada através do netbeans, mesmo depois de já ter o build feito.

    Mais uma vez, obrigado pela sua atenção e ajuda.

    Cumprimentos,

    João Gonçalves

  2. 1) Sim, um nó pode possuir um nome, e aí você pode recuperar esse nó mesmo sem ter nenhuma referencia a ele. Se você já pragramou em JavaScript é como um getElementById. Agora eu não tô lembrando qual a classe, mas tem sim. =D
    2) Como um Group de Rectangles, eu faço uso disso em http://silveiraneto.net/2009/01/06/javafx-easy-use-of-tiles/
    3) 10 a 20 segundos já é muito. Você está usando pack200 ou algo assim?

  3. João Gonçalves João Gonçalves

    Não. Por acaso o netbeans tem essa opção, mas ela está desactivada.
    No link em baixo pode ver um screencast em que lanço a aplicação e em que está visivel a execução do código java (prints na janela de output do netbeans) até o aparecimento da interface. Depois da aplicação ser lançada, a sua execução até é bastante rápida. De notar que também ainda está no inicio.

    http://jgonca.no-ip.org:40080/~joao/screencasts/screencast_javafx.swf

Leave a Reply

Your email address will not be published. Required fields are marked *