java.lang.ClassCastException при использовании JAVAFX - PullRequest
0 голосов
/ 16 октября 2018

Я получаю ошибку "java.lang.ClassCastException".Я пытаюсь сделать калькулятор и с JAVAFX (с SceneBuilder - если это необходимо), и я не могу отследить, где я сделал неправильно в коде.

Я пытаюсь заставить новое окно появитьсякогда нажата кнопка «ИСТОРИЯ», и она должна показать все предыдущие выполненные операции.

java.lang.ClassCastException: application.controller.MainWindowController не может быть приведен к application.controller.HistoWindowController

MainWindowController:

public class MainWindowController {

private Main main;

@FXML
TextField input1;
@FXML
TextField input2; 
@FXML
Label showAnswer;

public void setMain(Main main){
    this.main = main;
}
public void showAnswerSTR(String str) {
    showAnswer.setText("Answer:  " + str);;
}
@FXML
public void showHistory() {
    main.HistoryViewer();
}
@FXML
public void addNumbers(){
    Float inputA = Float.parseFloat(input1.getText());
    Float inputB = Float.parseFloat(input2.getText());
    Addition x = new Addition();
    String ans = x.operation(inputA, inputB);
    showAnswerSTR(ans);
}
@FXML
public void subtractNumbers(){
    Float inputA = Float.parseFloat(input1.getText());
    Float inputB = Float.parseFloat(input2.getText());
    Subtraction x = new Subtraction();
    String ans = x.operation(inputA, inputB);
    showAnswerSTR(ans);
}
@FXML
public void multiplyNumbers(){
    Float inputA = Float.parseFloat(input1.getText());
    Float inputB = Float.parseFloat(input2.getText());
    Multiplication x = new Multiplication();
    String ans = x.operation(inputA, inputB);
    showAnswerSTR(ans);
}
@FXML
public void divideNumbers(){
    Float inputA = Float.parseFloat(input1.getText());
    Float inputB = Float.parseFloat(input2.getText());
    Division x = new Division();
    String ans = x.operation(inputA, inputB);
    showAnswerSTR(ans);
}
}

HistoWindowController это:

public class HistoWindowController {

@FXML
VBox HistoryViewer;

public void showHistory(){
    StringTokenizer str = new StringTokenizer(getHistory(),";");
    while(str.hasMoreTokens()){
        HistoryViewer.getChildren().add(new Label(str.nextToken().toString()));
    }
}

private String history = "H I S T O R Y;";

public void addHistory(String history) {
    this.history += history + ";";
}

public String getHistory() {
    return history;
}

/*public String historyReader() {

    StringTokenizer str = new StringTokenizer(getHistory(),";");
    String temp = "";
        if(str.hasMoreTokens()) {
            temp += str.nextToken();
            temp += "\n";
        }
    return temp;
}*/
}

Основное это:

public class Main extends Application {

private Stage primaryStage;

@Override
public void start(Stage primaryStage) {
    this.primaryStage = primaryStage;
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("view/mainView.fxml"));
        AnchorPane mainFXML = (AnchorPane) loader.load();

        Scene scene = new Scene(mainFXML);
        primaryStage.setScene(scene);
        primaryStage.show();

        MainWindowController mainWindow = loader.getController();
        mainWindow.setMain(this);
    } catch(Exception e) {
        e.printStackTrace();
    }
}

public void HistoryViewer(){
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("view/HistoryView.fxml"));
        AnchorPane histoView = (AnchorPane) loader.load();

        Scene scene = new Scene(histoView);
        primaryStage.setScene(scene);
        primaryStage.show();


        HistoWindowController histoControl = loader.getController();
        histoControl.showHistory();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

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

Заранее спасибо

1 Ответ

0 голосов
/ 16 октября 2018

Я предполагаю, что это строка, где это происходит (проверьте трассировку стека): HistoWindowController histoControl = loader.getController ();

значение атрибута fx: controller в HistoryView.fxml - это MainWindowController

Спасибо @ fabian

...