JavaFX Canvas, возвращающий ноль - PullRequest
0 голосов
/ 21 мая 2018

Для тех, кто имеет опыт работы с JavaFX, я создал холст внутри моего конструктора сцены, но когда я на самом деле пытаюсь получить доступ к указанному холсту, он пуст, я не уверен, почему, поскольку я знаю, что он сделан внутри моего конструктора сцен и отображается вМой файл FXML Я отправил код на github, его можно найти здесь, если кто-нибудь захочет посмотреть, не ошибся ли я: https://github.com/ProSavage/JavaFXCalculator/tree/master/src/application/grapher Не стесняйтесь давать любые другие советы!

Вот соответствующий код

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.AnchorPane?>
 <?import javafx.scene.layout.HBox?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" 
minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0"  
xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="application.grapher.GrapherController">
<children>
  <HBox alignment="CENTER" layoutX="4.0" layoutY="280.0" prefHeight="20.0" 
prefWidth="593.0">
     <children>
        <TextArea prefHeight="37.0" prefWidth="569.0" />
     </children>
  </HBox>
  <Button layoutX="238.0" layoutY="336.0" mnemonicParsing="false" 
  prefHeight="50.0" prefWidth="125.0" text="Graph" />
     <HBox fx:id="canvasBox" layoutX="14.0" layoutY="20.0" 
prefHeight="250.0" prefWidth="570.0" />
 </children>
   </AnchorPane>

Класс

public class GrapherController {

@FXML
private HBox canvasBox;


public void test() {
    Canvas canvas = new Canvas(570,250);
    canvasBox.getChildren().add(canvas);
    double startX = canvas.getWidth()/2 * -1;
    double endX = startX * -1;
    double startY = canvas.getHeight()/2 * -1;
    double endY = startY * -1;

    GraphicsContext grapher = canvas.getGraphicsContext2D();
    grapher.beginPath();

    String equation = "x+1";
    grapher.moveTo(startX,Evaluator.eval(equation.replace("x",startX + "")));
    for (double i = startX; i < endX; i++) {
        grapher.lineTo(startX,Evaluator.eval(equation.replace("x",String.valueOf(i))));
    }






}



}

В основном при запуске метода теста, если я создаю холст и добавляю его в поле, холстnull, и если я попытаюсь сделать это в самом файле xml, он все равно будет пустым.Я чувствую, что есть какой-то важный шаг, который я пропускаю самому холсту.

1 Ответ

0 голосов
/ 21 мая 2018

На самом деле ваше canvasBox поле null.Но проблема заключается в вашем GrapherScene классе.Вы вручную создаете GrapherController и вызываете test() для этого экземпляра.Нет никакого возможного способа для canvasBox до , а не быть null в этом случае:

  • Вы никогда не устанавливали это самостоятельно
  • Экземпляр не былсоздается FXMLLoader, что означает, что не происходит внедрения зависимостей в поля FXML

Изменение:

public GrapherScene() {
    try {
        Stage grapherStage = new Stage();
        Parent root = FXMLLoader.load(getClass().getResource("grapher.fxml"));
        Scene scene = new Scene(root, 600, 400);
    //scene.getStylesheets().add(getClass().getResource("app.css").toExternalForm());
        grapherStage.setScene(scene);
        grapherStage.setTitle("Grapher");
        grapherStage.show();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    GrapherController grapher = new GrapherController();
    grapher.test();
}

В:

public GrapherScene() {
    try {

        Stage grapherStage = new Stage();
        FXMLLoader loader = new FXMLoader(getClass().getResource("grapher.fxml"));
        grapherStage.setScene(new Scene(loader.load());
        grapherStage.setTitle("Grapher");
        grapherStage.show();

        // Must be called AFTER loader.load()
        // Method has generic return type so explicit casting is not necessary in this case
        GrapherController grapher = loader.getController();
        grapher.test();

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

Примечание: я использую здесь метод instance FXMLLoader.load(), а не метод static FXMLLoader.load(URL) .


.информация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...