2017-09-17 225 views
1

我是JavaFx的新手。我試圖通過遵循教程來構建一個簡單的計算器。我一步一步跟着教程。當我運行該項目時,它顯示javafx fxml LoadException。我看了一些與此有關的解決方案,但仍無法解決。請幫我解決這個錯誤。(對不起,我長的帖子)javafx fxml LoadException

我的程序文件如下

MainController.java

package application; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 

public class MainController { 

@FXML 
private Label result; // label variable shows output above the buttons, check this 
private long number1 = 0; 
private String operator = ""; 
private boolean start = true; 
private Model model = new Model(); 

@FXML 
public void processNumbers(ActionEvent event) { 
    if (start) { 
     result.setText(""); // set the label(output) screen as blank first 
     start = false; 
    } 
    String value = ((Button) event.getSource()).getText(); // take number 1-9 and convert it into String, import the 
                  // button class otherwise will shows error 
    result.setText(result.getText() + value); 
} 

@FXML 
public void processOperators(ActionEvent event) { 
    String value = ((Button) event.getSource()).getText();`enter code here` 

    if (!value.equals("=")) { 
     if (!operator.isEmpty()) { 
      return; 
     } 
     operator = value; 
     number1 = Long.parseLong(result.getText()); 
     result.setText(""); 
    } else { 
     if (operator.isEmpty()) 
      return; 
     long number2 = Long.parseLong(result.getText()); 
     float output = model.calculate(number2, number2, operator); 

     result.setText(String.valueOf(output)); 
     start = true; 
     } 
     } 

} 

Model.java

package application; 

public class Model { //for some action event 

    public float calculate(long number1,long number2,String operator) { 

    switch(operator) { 
     case "+": 
      return number1+number2; 
     case "-": 
      return number1-number2; 
     case "*": 
      return number1*number2; 
     case "/": 
      if(number2==0) return 0; 
      return number1+number2; 
     default: 
      return 0; 

     }//switch case 


    } 


} 

Main.java

package application; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.stage.Stage; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.control.*; 

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      Parent root = (Parent) FXMLLoader.load(getClass().getResource("/application/CalculatorFxmlFile.fxml")); 
      Scene scene = new Scene(root,400,400); 
      scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

CalculatorFxmlFile

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.HBox?> 
<?import javafx.scene.layout.StackPane?> 
<?import javafx.scene.layout.VBox?> 
<?import javafx.scene.text.Font?> 

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="300.0" spacing="10.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainController"> 
    <children> 
     <StackPane prefHeight="50.0" prefWidth="200.0"> 
     <children> 
      <Label fx:id="result" prefHeight="17.0" prefWidth="327.0" text="Label"> 
       <font> 
        <Font name="System Bold" size="18.0" /> 
       </font> 
      </Label> 
     </children></StackPane> 
     <HBox alignment="CENTER" prefHeight="50.0" prefWidth="300.0" spacing="10.0"> 
     <children> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="50.0" text="7"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="50.0" text="8"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="50.0" text="9"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button fx:id="result" mnemonicParsing="false" onAction="#processOperators" prefWidth="50.0" text="/"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
     </children> 
     </HBox> 
     <HBox alignment="CENTER" prefHeight="50.0" prefWidth="300.0" spacing="10.0"> 
     <children> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="50.0" text="4"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="50.0" text="5"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="50.0" text="6"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processOperators" prefWidth="50.0" text="*"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
     </children> 
     </HBox> 
     <HBox alignment="CENTER" prefHeight="50.0" prefWidth="300.0" spacing="10.0"> 
     <children> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="50.0" text="1"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="50.0" text="2"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="50.0" text="3"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processOperators" prefWidth="50.0" text="-"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
     </children> 
     </HBox> 
     <HBox alignment="CENTER" prefHeight="50.0" prefWidth="300.0" spacing="10.0"> 
     <children> 
      <Button mnemonicParsing="false" onAction="#processNumbers" prefWidth="110.0" text="0"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processOperators" prefWidth="50.0" text="="> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
      <Button mnemonicParsing="false" onAction="#processOperators" prefWidth="50.0" text="+"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 
     </children> 
     </HBox> 
    </children> 
</VBox> 

異常產生

javafx.fxml.LoadException: 
/C:/AllPrograms/Java/eclipse1/CalculatorJavaFx/bin/application/CalculatorFxmlFile.fxml:37 

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579) 
    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 application.Main.start(Main.java:15) 
    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(Unknown Source) 
Caused by: java.lang.IllegalArgumentException: Can not set javafx.scene.control.Label field application.MainController.result to javafx.scene.control.Button 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source) 
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(Unknown Source) 
    at java.lang.reflect.Field.set(Unknown Source) 
    at javafx.fxml.FXMLLoader.injectFields(FXMLLoader.java:1163) 
    at javafx.fxml.FXMLLoader.access$1600(FXMLLoader.java:103) 
    at javafx.fxml.FXMLLoader$ValueElement.processValue(FXMLLoader.java:857) 
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:751) 
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527) 
    ... 17 more 
+0

你有2個元素'FX:

float output = model.calculate(number2, number2, operator); 

您在calculate方法無緣number1變量ID = 「結果」 ' – fabian

+0

我刪除了一個,它正在工作 –

回答

1

這是你的錯誤(在你的FXML文件):

<Button fx:id="result" mnemonicParsing="false" onAction="#processOperators" prefWidth="50.0" text="/"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Button> 

此按鈕id是「結果」,它也是標籤的標識。你應該刪除這個id屬性(我認爲你錯過了它),或者將它改爲本教程建議的屬性。

UPDATE

此操作師,但您要添加的數字number1number2

case "/": 
    if(number2==0) return 0; 
    return number1+number2; 

,所以你應該執行部門不另外

case "/": 
    if(number2==0) return 0; 
    return number1/number2; 

更新2

我發現另一個錯誤也在這裏:

float output = model.calculate(number1, number2, operator); 
+0

由您的幫助修復。但計算器並沒有給我實際的結果:(它產生錯誤的結果@pleft –

+0

錯誤的結果是一個完全不同的問題,而不是你正在問的'LoadException',但是我更新了我的答案,你在分割運算符中有錯誤,你在添加數字而不是分割,最後你也可以接受我的答案。 – pleft

+0

我建議你重新做你的教程,我發現你的代碼有許多不一致之處,但我也不知道你到底想要達到什麼目的,所以你最好再次從頭開始。 – pleft