j-menezes, valeu!!! Eu baixei e instalei antes a versão para windows 64b, aí como estou “mais que perdido” em javafx e scenebuilder no netbeans baixei esse kit imaginando que pudesse me ajudar e tinha documentação…aí aumentaram meus problemas…rs
Vc acha que para um iniciante é melhor eu esquecer esse kit?
O que tem nele?
Voce desenha a tela dentro do SceneBuilder, mas claro que poderá fazer a tela por codigo sem o SceneBuilder.
Uma vez desenhada a tela no SceneBuilder, dentro do programa javaFX você chama essa tela desenhada atraves da extensão fxml.E pronto.
j-menezes, agora entendi um pouco e parece facil de fazer, mas não pra mim ainda, que
nem teria ideía de como chamar essa tela!
pelo que vi no curso em video, do java para iniciantes, se eu criasse uma aplicação fx, o netbeans mesmo criaria a pasta controller e fxml, mas com essa versão que tenho não faz isso!
Estou usando o netbeans 11 e jdk12
E’ realmente bem simples, basta seguir a receitinha.
(no netbeans 11 e jdk 12 voce deve criar um projeto modular)
1.New Project
1.1 Java with Ant
1.1.1 Java Modular Project
Obs : ( No Projeto com o botao direito do mouse ) Properties / Libraries / Compile / Module Path [+] (Add jar / folder) <-- uma forma apenas
exemplo veja se tudo esta dentro desse diretorio javafx-sdk-12.0.1/lib
javafx.base.jar // essa
javafx.controls.jar // supondo que usara essa
javafx.fxml.jar // supondo que usara essa
javafx.graphics.jar // supondo que usara essa
javafx.media.jar
javafx.swing.jar
javafx-swt.jar
javafx.web.jar
Dentro do Projeto
2 New Module ( Com o botao direito do mouse )
2.1 vou dar uma nome para teste meuModulo
2.2 procure por module-info.java // meuModulo – classes – default package module-info.java
2.3 dentro dele coloca
module meuModulo {
requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
exports meutest.com; // sao os packages do seu modulo que serão visiveis
opens meutest.com to javafx.fxml; // se for alterar propriedades dos componentes
}
3.Quando voce cria um modulo no netbeans 11, ele não esta aparecendo a opçao
New File --> Empty FXML
então nesse caso você simplesmente abre o SceneBuilder e cria o seu FXML e Save As dentro da pasta do projeto meutest com de maneira que no netbeans apareça
–> meutest.com
-----> minhaTela.fxml // escolha o nome que quiser
4.agora chegamos no ponto que você queria saber, porem trabalhar com modulos no java 11 e superior é um pouco deferente, e tem muitas vantagens.
(Agora toda vez que for mudar a tela usa botao direito do mouse --> Open ou edit para alterar alguma coisa na mão dentro do FXML)
A opção Make Controller // botao direito do mouse, criará um arquivo java para controlar essa tela em questão e liga-la com seus programas.
Resta apenas saber como chamar esse controller
package meutest.com;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TelaFXML extends Application {
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("Test FXML");
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("minhaTela.fxml"));
Parent parent = (Parent)fxmlLoader.load();
// O nome do programa Tela1Controller, foi Make Controller do netbeans quem deu e criou o programa
MinhaTelaController telacontroller = fxmlLoader.getController();
Scene scene = new Scene(parent);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
esse erro vai sumir assim que voce dar o make controller e ele irá criar um programa java ou mesmo voce criar ou colocar qualquer programa java no package.
Putz!!! Criei um arquivo do tipo Java Class, e coloquei o nome do pacote "meutest.com e o erro sumiu mesmo!!!
Perdi a manhã toda tentando corrigir!!! (bicho é bicho…kkkk)
Mas agora não entendi como fazer esse “Make Controller”.
Bom !!! para usar o make Controller, clica com o botao direito do mouse sobre o minhaTela.fxml
E para criar um main ai dentro do package meutest.com, novamente com o botao direito em cima dele e new Java Class, entao basta colar o exemplo que postei.
Agora SIMM!!!
Finalmente apareceu a tela, pelo netbeans!!!
Muuuito obrigado pela paciencia!!!
Sempre devo colar esse seu exemplo na main ??? O controller fica vazio só com o package e public class???
Mas e para editar a tela e fazer as modificaçoes???
Não , não, Eu apenas enviei um exemplo de como se faz.
Em relação ao Controller estar vazio, a medida que voce for populando suas telas dar um nome para os componentes, criar eventos tudo dentro do sceneBuilder, voce usará novamente o make Controller aparecerá tudo dentro do programa MinhaTelaController.
Para modificar a tela vale o que eu expliquei logo lá no inicio; botao direito do mouse sobre minhaTela.fxml e Open. Depois de alterar Salva e no netbeans chama de novo make controller.
j-menezes, desculpe te encher mais uma vez, porém, Montando o seu exemplo só tentei colocar um label e um botão, seguindo um video do descompila, que fica tudo igualzinho mas olha o erro que dá:
1.Na minhaTela.fxml (Botao direito do mouse opcao Open)
2.Dentro do SceneBuilder clique no item que voce deseja e no lado direito selecione Code
3.na linha fx:id coloca um nome para essa variavel
4.Save <— nesse caso nao precisa ser Save As, isso porque ele vai salvar em cima do minhaTela.fxml que foi aberto
5. de volta no NetBeans
6. Na minhaTela.fxml (Botao direito do mouse opcao Make Controller)
7. Pronto, veja que dentro do MinhaTelaController.java aparecerá @FXML e logo abaixo o nome da variavel que você criou lá no SceneBuilder
Foi assim mesmo que eu fiz ontem! ( Umas 500 vezes…kkk)
Mas o erro continua!
Cheguei a pensar que poderia ser algum erro de vínculo entre o Scene e o NetBeans. Reparei o NetBeans, mas nada!
Alguma ideia?
Tenta criar outra tela fxml la no sceneBuilder coloca o nome nos componentes, fx:id, tem que clicar no componente que quer colocar o nome. depois lá no NetBeans usa Make Controller e veja se está gerando o @FXML.
Outra coisa, essa linha que está aparecendo com erro na MinhaTelaController.java apaga ela e usa o Make Controller novamente. E certifique que ao salvar lá no sceneBuilder se ele esta’ salvando corretamente no seu projeto dentro do netBeans.
Java para esse tipo de coisa é bem estável em todas as plataformas.
Ainda nada!!! Não sei o que há!
Fiz tudo novamente ( criei o programa do zero) e segui seus passos, mas a lista do erro é o mesmo.
O interessante é que quando faz o “Build eClean” não dá erro nenhum! ele compila normal!
Só na hora de executar é que dá o erro!
olha a lista (
< html> Exception in Application start method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: javafx.fxml.LoadException:
/C:/Users/Clodoaldo/Documents/NetBeansProjects/FxMenezes/build/modules/meuModulo/meutest/com/minhaTela.fxml:12
at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
at meuModulo/meutest.com.MeuMain.start(MeuMain.java:18)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
... 1 more
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private javafx.scene.control.Label meutest.com.MinhaTelaController.lblMensagem accessible: module meuModulo does not "opens meutest.com" to module javafx.fxml
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:341)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:170)
at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor.addAccessibleFields(FXMLLoader.java:3479)
at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor$1.run(FXMLLoader.java:3444)
at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor$1.run(FXMLLoader.java:3440)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:310)
at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor.addAccessibleMembers(FXMLLoader.java:3439)
at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor.getControllerFields(FXMLLoader.java:3378)
at javafx.fxml/javafx.fxml.FXMLLoader.injectFields(FXMLLoader.java:1170)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processValue(FXMLLoader.java:865)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:759)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
... 12 more
Exception running application meutest.com.MeuMain
C:\Users\Clodoaldo\AppData\Local\NetBeans\Cache\11.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\Clodoaldo\AppData\Local\NetBeans\Cache\11.0\executor-snippets\run.xml:40: Java returned: 1
BUILD FAILED (total time: 2 seconds)
</html>
Detalhe: Antes da erro no minhaTela.fxml de tamanho da fonte, aí coloquei um label e button padarão, sem mudar nada, só mudei o fx:id…aí aparece o erro!
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class MeuMain extends Application {
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("Test FXML");
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("minhaTela.fxml"));
Parent parent = (Parent)fxmlLoader.load();
// O nome do programa Tela1Controller, foi Make Controller do netbeans quem deu e criou o programa
MinhaTelaController telacontroller = fxmlLoader.getController(); //MeuMakeController
Scene scene = new Scene(parent);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}