2016-07-07 5 views
-1

최근에 FXML과 함께 JavaFX를 사용하기 시작했습니다. FXML의 일부 기능을 테스트하기위한 작고 간단한 프로그램을 작성했습니다. 여기 내 코드가있다. 메인 클래스 :JavaFX 및 FXML 파일

package main; 

import javafx.application.Application; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.RadioButton; 
import javafx.stage.Stage; 

import javax.swing.*; 
import java.io.IOException; 

public class Main extends Application { 

    @FXML 
    private RadioButton button; 

    @Override 
    public void start(Stage primaryStage) { 

     Parent root = null; 
     try { 
      root = FXMLLoader.load(getClass().getResource("Main.fxml")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     String input = JOptionPane.showInputDialog("Enter something."); 
     button.setText(input); 

     Scene scene = new Scene(root,300,200); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 

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

} 

Main.fxml는 :

javafx.fxml.LoadException: 
/C:/Users/kenta/IdeaProjects/Other%20projects/Test/out/production/Test/main/Main.fxml:7 

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 
    at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103) 
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922) 
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971) 
    at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220) 
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744) 
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) 
    at main.Main.start(Main.java:24) 
    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) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.ClassNotFoundException: main.Controller 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920) 
    ... 22 more 
Exception in Application start method 
Exception in thread "main" 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.NullPointerException 
    at main.Main.start(Main.java:30) 
    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 

Process finished with exit code 1 

가 어떻게이 RadioButton 구성 변수로 작업 할 수 있습니다 내가이 프로그램을 실행하면

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 


<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="248.0" prefWidth="366.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="main.Main"> 
    <children> 
     <RadioButton layoutX="140.0" layoutY="116.0" mnemonicParsing="false" fx:id="rb" on/> 
    </children> 
</Pane> 

, 나는 오류 메시지가 "단추"?

Kenta1561

+1

의 사용 가능한 복제 [자바 FX - 응용 프로그램 클래스가 될 수있는 컨트롤러 클래스 (http://stackoverflow.com/questions/33303167/javafx-can -application-class-be-the-controller-class) – Itai

+0

링크 된 질문보기. 참고로, JavaFX와 Swing (JOptionPane은 Swing 구성 요소)을 혼합하는 것은 일반적으로 좋지 않은 생각입니다. 그것은 할 수 있지만 가능한 경우 일반적으로 피해야합니다. – Itai

+0

컨트롤러 클래스를 만드는 데 신경 쓰지 않고 오류가 발생하기 때문에 FXML 파일에 정의 된 클래스에서 변수를 사용하는 방법을 알고 싶습니다. – Kenta1561

답변

1

코드에 다음과 같은 수정 사항을 적용하십시오 :

이 당신의 메인 클래스 컨트롤러 것

FXMLLoader loader=new FXMLLoader(getClass().getResource("Main.fxml")); 
loader.setController(this); 
root = loader.load(); 

root = FXMLLoader.load(getClass().getResource("Main.fxml")); 

를 교체합니다. 이렇게하지 않으면 FXMLLoader는 FXMLLoader.load(URL)의 인스턴스와 다른 메인 클래스의 새 인스턴스를 만듭니다.

는 다음에 fxml 파일을 변경

:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 


<Pane minHeight="0" minWidth="0" prefHeight="248.0" prefWidth="366.0" xmlns:fx="http://javafx.com/fxml"> 
    <children> 
     <RadioButton layoutX="140.0" layoutY="116.0" mnemonicParsing="false" fx:id="button"/> 
    </children> 
</Pane> 

FX의 값 :. ID가이 설명서의 RadioButton을 저장할 필드의 이름과 동일해야합니다 또한 네임 스페이스 선언은 xmlns:fx="http://javafx.com/fxml"해야한다. 또한 maxHeight 및 maxWidth 속성을 -Infinity로 설정하면 레이아웃의 크기가 0 픽셀보다 커지지 않습니다. <children></children> 태그를 생략 할 수도 있습니다. 당신이 FXML을 배우고 싶은 경우에

, 나는이 문서를 제안한다 Introduction to FXML

관련 문제