Re: [javafx-br] Quando devo usar FXML?

941 views
Skip to first unread message

Filipe Portes

unread,
Aug 2, 2012, 9:29:34 AM8/2/12
to java...@googlegroups.com
Ola junior, 

as vantagens do fxml são 
-O Scene Builder que gera apenas FXML mesmo, e torna mais fácil a criação e manutenção de um layout.
-Internacionalização facilitada
-O fxml pode ser usado por qualquer linguagem da jvm como Java, Scala, clojure, etc...
-código da camada de visão desacoplado de fato,
-camada de visão mais "legível", pois na linguagem de marcação é mais fácil entender o layout
-um designer com pouco aprendizado consegue usar o Scene Builder, liberando o desv da função de ficar "ajeitando" o layout dentro do código.

desvantagens
-para layouts muito complexos, customização de componentes, coisas mais "hard" o fxml pode acabar complicando as coisas

o fxml é ideal para aquelas telas de CRUD, com layout simples e sem muito frufru... mas não acho que seja ideal para telas onde é necessário a criação de componentes mais complexos, ou customizações de componentes, layouts mais complexos...  nesses casos o fxml pode complicar as coisas. Nada te impede de misturar as coisas, então use fxml onde ele facilitar as coisas e código onde achar que é melhor.


2012/8/1 Junior Tada <junio...@gmail.com>
Galera, minha dúvida é: com o JavaFX 2.0 eu posso criar a camada visual da aplicação tanto por código FXML como por código normal em java.
Usando o Scene Builder ele só gera o código FXML(Estou certo?). Para uma aplicação Desktop em MVC qual o melhor método para criar a parte gráfica da minha aplicação?
Quais as vantagens e desvantagens de cada método?
Se alguem puder explicar eu estou perdido com relação a isto.
Obrigado



--
Filipe Portes - @filipeportes
Java Architect - Senior Java EE/Web
JUGLeader Gojava - @gojava

Junior Tada

unread,
Aug 2, 2012, 5:25:48 PM8/2/12
to java...@googlegroups.com
Obrigado Filipe Portes e Tianodraco. Agora ficou mais claro. Eu estava com receio de fazer toda a layout em FXML ou via código java e descobrir depois que teria que refazer de outra forma. Mas eu posso fazer tudo via FXML e aproveitar a produtividade que o Scene Builder proporciona e fazer por código oque sentir falta por FXML. E quanto ao código de esqueleto do controler do FXML que o Scene Builder gera? Depois que eu fiz alguns layouts que eu reparei que ele gerava. O código sai adequadamente? É o designer patterns ideal para a classe controller do código FXML?
E mais uma vez, muito obrigado pela explicação.

Tianodraco

unread,
Aug 2, 2012, 6:37:37 PM8/2/12
to java...@googlegroups.com
Junior, boa pergunta

Aquele código do controller gerado pelo SB é compatível com o MVC (e deveria ser) mas é para substituir só quando o programador ainda nãoi colocou nenhum código na classe controller dentro do netbeans/eclipse, pq no SB ele só escreve sobre o layout naquele controller, ou seja, todo o resto da programação (as funções, variáveis, constantes etc) ele não gera (e nem poderia)... e tb não atualiza do netbeans/eclipse.

Então, construa a sua tela no scene builder por completo, pegue o código do controller q ele gera e substitua no netbeans/eclipse, depois vá programar as regras de negócio.... daí em diante não olhe mais pra aquele código controller do scene builder.

Uma dica importante: quando vc for nomear os controles, faça antes pelo controller do netbeans/eclipse (colocando os FXML) e salve, depois no Scene Builder clique no dropdown da id e ele vai carregar o nome q vc acabou de colocar lá no controller (infelizmente o caminho inverso não é possivel -> colocar um nome de um controle no scene builder não atualiza a classe controller do netbeans/eclipse), a comunicação aqui é unidirecional.... na próxima versão eles deverão arrumar isso.

Outra dica, quando vc for estilizar o seu aplicativo, utilize CSS e não FXML. Use o Scene builder apenas como recursos para colcoar as cosas dentro da tela, mas use css para estilizar. Pq? É mais fácil e vc pode usar skins na sua aplicação, além do q o CSS para o javaFX é o mesmo CSS para a web, a única diferença é o acréscimo do "-fx-" antes dos seletores.

Sobre o FXML: Caso vc queira editar o FXML no seu editor de programação, o Auto-completation do FXML não funciona no Netbeans (bug de projeto, na proxima versão eles arrumam isso) mas funciona perfeitamente no eclipse.

Se vc optar pelo eclipse, não perca tempo e procure no google por "e(fx)clipse": é a mlehor ide eclipse para javafx (eu uso e recomendo).

Qualquer coisa posta aí.  []'s

Junior Tada

unread,
Aug 2, 2012, 8:14:39 PM8/2/12
to java...@googlegroups.com

Obrigado Tianodraco, eu não estou usando o Scene Builder integrado com o netbeans pq estou usando o Scene Builder versão Mac no Linux, para abrir,  ele roda de um comando no terminal. Estava usando aquele esqueleto de controller e colando no netbeans antes de começar a programar o controller como vc disse. Fiquei curioso de testar esse e(fx)clipse que vc mencionou. Vou procurar se tem versão para Linux e testar mais tarde.
Obrigado pelas dicas. Só fiquei com uma dúvida: é possivel receber o arquivo.css no controler e setar para um outro arquivo.css, por exemplo em um menu de escolha de layout?

Tianodraco

unread,
Aug 2, 2012, 8:30:20 PM8/2/12
to java...@googlegroups.com
Junior é possível sim fazer isso e muito mais.
Exemplo:

 button.setOnAction(new EventHandler() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Clicked: " 
+ currentStyleSheet.getValue());
                
                //Here the currentStyleSheet.getValue() will be null when the 
                //program is run for the first time. See console for output.
                if (currentStyleSheet.getValue() == null || 
                  currentStyleSheet.getValue().contains("minimalTheme.css")) {
                    currentStyleSheet.setValue("blueTheme.css");
                }
                else {
                     currentStyleSheet.setValue("minimalTheme.css");
                }
            }
        });

Junior Tada

unread,
Aug 2, 2012, 8:43:07 PM8/2/12
to java...@googlegroups.com
Deixa eu perguntar outra coisa: quando abro um novo projeto no Scene Builder ele já vem com um AnchorPane que eu não consegui setar o title. Tem como trocar o AnchorPane que já vem por um TitledPane? Não consigo remover o AnchorPane que vem por padrão.
Obrigado pela ajuda.

Tianodraco

unread,
Aug 2, 2012, 9:14:52 PM8/2/12
to java...@googlegroups.com
Junior se tem como remover pelo Scene Builder eu não sei, mas pelo FXML do eclipse é só trocar.

Mas, vc pode fazer o seguinte dentro do Scene Builder:
1 - Adicione um TitledPane
2 - Clique com o botão direito sobre ele e escolhe "Fit to Parent".

O nó raiz ainda vai continuar sendo um anchor, mas toda a visualização vai ser do titledpane

Junior Tada

unread,
Aug 5, 2012, 7:46:49 PM8/5/12
to java...@googlegroups.com
Testei dessa forma, mas ele fica com duas barras. Uma sem título e com os botões minimizar, maximizar e fechar e uma outra barra abaixo só com o título. A superior pega o defualt do sistema e de baixo vem com um padrão azul. Na verdade eu estava tentando só colocar o título no anchor pane ou trocar ele direto por um title pane. Vou testar outras formas. 
Obrigado pelas dicas.

Junior Tada

unread,
Aug 5, 2012, 8:10:09 PM8/5/12
to java...@googlegroups.com
Fazendo alguns testes aqui consegui usando o método settitle do stage. Mas agora eu fiquei embolado com as instâncias das janelas. Minha idéia era abrir uma tela de login que chama uma tela principal que chama janelas internas das opções do menu.

Junior Tada

unread,
Aug 8, 2012, 5:15:45 PM8/8/12
to java...@googlegroups.com
Não consegui de forma alguma carregar um arquivo fxml quando a classe main está em algum package que não seja no default package. E não consegui também carregar um arquivo fxml por outra classe, ele só carrega pela classe main.
Alguem sabe como fazer isto?

Junior Tada

unread,
Aug 8, 2012, 10:43:18 PM8/8/12
to java...@googlegroups.com
Consegui carregar o fxml quando a classe main não está no default package. Os arquivos fxml devem estar dentro do mesmo package da classe main. Só funcionou assim aqui. Pode ser algum bug do Netbeans ou a versão do JavaFx que estou usando. E consegui chamar um segundo Stage fora da classe main. No caminho para o método FXMLLoader.load o caminho deve estar completo <package.ClasseMain>. 
Deixo aqui o relato dos meus teste. Espero que possa ajudar alguém. Mesmo no fórum da Oracle sobre o JavaFx existem muitas dúvidas sobre o assunto.

Tianodraco

unread,
Aug 10, 2012, 12:24:52 PM8/10/12
to java...@googlegroups.com
Junior me adiciona no skype...

Junior Tada

unread,
Oct 3, 2012, 10:00:13 AM10/3/12
to java...@googlegroups.com
E ae Tianodraco,  desculpa a demora em responder, fiquei de recuperação em duas matérias da faculdade, fiquei com o tempo corrido.
Meu id no Skype: juniortada
Mais eu entro muito pouco no Skype
falow..

Em sexta-feira, 10 de agosto de 2012 13h24min52s UTC-3, Tianodraco escreveu:
Junior me adiciona no skype...
Reply all
Reply to author
Forward
0 new messages