[Resolvido] Migrar do Swing pro FX, quem disse que é fácil?

Boa Noite!
Vejo muita gente falando da necessidade de programadores Swing migrarem para o JavaFX. Que o JavaFX é mais bonito, mais simples, de fácil entendimento… Fácil entendimento?
Baixei o Scene Builder e fui abrir uma aplicação de exemplo que vem no próprio NetBeans para dar uma olhada. Fiquei completamente perdida!
Foi criada tantas coisas que não entendi foi nada. Quando disseram que era + Fácil, eu achei que era + fácil mesmo.

......desmotivada :frowning:

Olá, rsrsrs :sweat_smile:
Pode parecer fácil para alguns, mas o fato é que não é simples a migração. Todo front precisa ser reescrito.
Pra quem já trabalhou muito com Swing e depois muda para FX, quando pega o jeito dele concorda que é bem melhor.
Com certeza é uma nova curva de aprendizado, onde vc precisa focar no objetivo final.
Da mesma forma que as pessoas dizem que é melhor desenvolver pra web, concordo plenamente, porém bem mais complicado que desktop, é mais difícil, mas o resultado final é melhor.

Na maioria das vezes aquilo que é melhor para o usuário, é bem ao contrário para o desenvolvedor…

Difícil! Eu estou seguinte o seguinte tutorial: http://code.makery.ch/library/javafx-8-tutorial/pt/part1/
Fiz exatamente igual, a única diferença é que o tutorial usa o Eclipse e eu utilizo o NetBeans. E não funciona, não abre nada, nao “invoca” as janelas… simplismente nada JavaFX … te odeio :smiling_imp:

Que o JavaFX precisa de bem menos linhas de código escritas isso não é dúvida, mas também não acho uma coisa simples. Conheço uma série de aulas que há um exemplo de JavaFX (Infelizmente só um) no canal Curso em Vídeo, é a 5ª aula do curso de Java. /*Não tem como eu postar o link no momento*/ Acho que vale a pena dar uma olhada, é uma aula bem didática, da pra ter uma noção melhor sobre JavaFX, aliás, coisas novas sempre são de difícil aprendizado em um primeiro momento.

Olá,
Concordo que pra quem já está bem acostumado com o Swing é meio estranho a ideia dos controllers e de ter que usar loaders e etc. Com o tempo se pega a prática, entretanto não deixa de ser verboso o código para se abrir uma simples tela. enquanto no swing basta usar new MinhaJanela().show();, no FX tem que usar loader, criar uma scene, criar um stage… Certamente isso assusta e toma muito tempo, por isso criei minha própria biblioteca para criação de janelas, facilita muito pra quem já conhece o swing, funciona parecido, dê uma olhada: WindowControllerFx, certamente vai achar mais fácil (não é a salvação da humanidade, mas… facilita).

Sobre outras dificuldades, eu também encontrei quando fui migrar. Com o tempo você acaba percebendo que há mais ganhos que perdas, o que me fez gostar do Fx foram as possibilidades de customização que são muito facilitadas com o CSS, além de animações com Timeline que deixam o App muito top, criei um conceito de app, você pode conferir aqui: AwesomeUI.

Em suma tive uma facilidade maior com o FX por já ter tido experiências com o Android que muito se assemelham, exemplo: o coneceito de controllers -> Activity, os layouts em FXML -> XML do Android. No fim das contas você percebe que separar as coisas é bom e facilita a manutenção e crescimento do código. Não desista :slight_smile:

Se está iniciando ainda recomendo dar uma olhada nesse Projeto de Exemplo, que criei para iniciantes em uma palestra que ministei sobre o JavaFx. É um projeto simples mas está todo comentado e com bons exemplos de uso dos componentes e APIs do FX :wink:.

Boa Tarde Andrauss! Eu olhei seu exemplo e fiz o seguinte:

package novoapp;

import java.io.IOException;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class NovoApp extends Application {
    
    @Override
    public void start(Stage primaryStage) throws IOException {
               
        FXMLLoader loader = FXMLLoader.load(getClass().getResource("/novoapp/view/tela_inicial.fxml"));
        
        AnchorPane pai = loader.load();
        
        Scene cena = new Scene(pai);
        
        primaryStage.setScene(cena);
        primaryStage.setTitle("tentando...");
        primaryStage.show();
        
    }

    public static void main(String[] args) {
        launch(args);
    }
    
}

Eu utilizo o NetBeans, ele diz que foi “construido com sucesso”, porém, não abre a Tela. e Acima da mensagem de construção vem isso:

ant -f “C:\Users\katia neves\Desktop\Trabalhos em Java\Trabalhos com NetBeans 8.2\Perfect World - Contas\NovoApp” jfxsa-run
init:
Deleting: C:\Users\katia neves\Desktop\Trabalhos em Java\Trabalhos com NetBeans 8.2\Perfect World - Contas\NovoApp\build\built-jar.properties
deps-jar:
Updating property file: C:\Users\katia neves\Desktop\Trabalhos em Java\Trabalhos com NetBeans 8.2\Perfect World - Contas\NovoApp\build\built-jar.properties
Compiling 1 source file to C:\Users\katia neves\Desktop\Trabalhos em Java\Trabalhos com NetBeans 8.2\Perfect World - Contas\NovoApp\build\classes
compile:
Detected JavaFX Ant API version 1.3
Launching fx:jar task from C:\Program Files\Java\jdk1.8.0_111\jre…\lib\ant-javafx.jar
Warning: From JDK7u25 the Codebase manifest attribute should be used to restrict JAR repurposing.
Please set manifest.custom.codebase property to override the current default non-secure value ‘*’.
Launching fx:deploy task from C:\Program Files\Java\jdk1.8.0_111\jre…\lib\ant-javafx.jar
No base JDK. Package will use system JRE.
No base JDK. Package will use system JRE.
jfx-deployment-script:
jfx-deployment:
jar:
Copying 12 files to C:\Users\katia neves\Desktop\Trabalhos em Java\Trabalhos com NetBeans 8.2\Perfect World - Contas\NovoApp\dist\run801885016
jfx-project-run:
Executing C:\Users\katia neves\Desktop\Trabalhos em Java\Trabalhos com NetBeans 8.2\Perfect World - Contas\NovoApp\dist\run801885016\NovoApp.jar using platform C:\Program Files\Java\jdk1.8.0_111\jre/bin/java
Device “Intel® HD Graphics Family” (\.\DISPLAY1) initialization failed :
WARNING: bad driver version detected, device disabled. Please update your driver to at least version 8.15.10.2302
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassCastException: javafx.scene.layout.AnchorPane cannot be cast to javafx.fxml.FXMLLoader
at novoapp.NovoApp.start(NovoApp.java:19)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
… 1 more
Exception running application novoapp.NovoApp
Java Result: 1
Deleting directory C:\Users\katia neves\Desktop\Trabalhos em Java\Trabalhos com NetBeans 8.2\Perfect World - Contas\NovoApp\dist\run801885016
jfxsa-run:

Não sou boa com inglês ( é eu sei que é o basico para estudar programação ), mas parece que tem algo falando sobre atualizar o JDK… mas nao tenho certeza… só sei que não chama a tela que eu fiz no Scene Builder!

Sabem dizer o que preciso fazer?

Olá o erro foi um pouco explícito, não pôde converter AnchorPane para FXMLLoader na linha 19.
Explicando: quando vc faz FXMLLoader.load é retornado uma instância do painel root do seu FXML. No seu caso seria:

FXMLLoader loader = New FXMLLoader(seufxml);
AnchorPane pane = loader.load();

Não entendi, em que diferencia o que você faz aqui:

 public void start(Stage palco) throws Exception {

        // Criando o carregador que irá buscar a
        // interface de usuário e trazê-la para ser manipulada via código
        FXMLLoader carregador = new FXMLLoader(getClass().getResource("/controledespesas/view/tela_principal.fxml"));

        // Carregando a interface
        AnchorPane pai = carregador.load();

        // Montagem da cena
        Scene cena = new Scene(pai);

        // Montagem do palco
        palco.setScene(cena); // setando a cena que será exibida no palco
        
        palco.setTitle("Controle de Despesas - 14º CIC"); // setando o título
        
        // Exibindo o palco
        palco.show();
    }

para este:

public class NovoApp extends Application {
    
    @Override
    public void start(Stage primaryStage) throws Exception {
               
        FXMLLoader loader =  new FXMLLoader.load(getClass().getResource("/novoapp/view/tela_inicial.fxml"));
        
        AnchorPane pai = loader.load();
        
        Scene cena = new Scene(pai);
        
        primaryStage.setScene(cena);
        primaryStage.setTitle("tentando...");
        primaryStage.show();
        
    }

Não entendi.

A diferença está no FXMLLoader.load() como disse

Sério… não acredito que eu escrevi, reescrevi, dei CTRL+C, CTRL+V, li, re-li e não vi aquele loader ali rsrsrsrsrs Desculpe minha ignorância e muito Obrigada!