Как сделать сцену локальной JavaFX - PullRequest
0 голосов
/ 21 октября 2019

Сцена в начале лямбды имеет ошибку, которая не является локальной. Как сделать это локальным. Я попытался добавить вверх, но показывает ноль. Как сделать сцену локальной в лямбде, потому что сцена устанавливает primaryStage. Мне нужны другие узлы для GridPane. Я пытаюсь нарисовать на холсте. Пожалуйста, помогите решить эту проблему. Спасибо заранее!

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TestFX extends Application {

    Node scene; // i tried adding this but throws null at the lambda

    @Override
    public void start(Stage primaryStage) throws Exception {

        primaryStage.setTitle("MyPaint");

        RadioButton radioButton1 = new RadioButton("Draw");
        RadioButton radioButton2 = new RadioButton("Erase");
        RadioButton radioButton3 = new RadioButton("Circle");

        ToggleGroup radioGroup = new ToggleGroup();

        radioButton1.setToggleGroup(radioGroup);
        radioButton2.setToggleGroup(radioGroup);
        radioButton3.setToggleGroup(radioGroup);

        Button b1 = new Button("Clear Canvas");

        TextField colorText = new TextField();
        colorText.setText("Colors");

        Canvas canvas = new Canvas(300, 250);
        GraphicsContext gc = canvas.getGraphicsContext2D();

           // scene cannot be resolved without initializing at top: Node scene;
            scene.setOnMousePressed(q -> {
                gc.setFill(Color.BLACK);
                gc.setLineWidth(1); 
                gc.beginPath();
                gc.lineTo(q.getSceneX(),
                q.getSceneY());
                gc.getStroke();
                });

        gc.strokeText("Hello Canvas", 150, 100);

        GridPane gridPane = new GridPane();

        GridPane.setConstraints(radioButton1, 0, 0);
        GridPane.setConstraints(radioButton2, 0, 1);
        GridPane.setConstraints(radioButton3, 0, 2);
        GridPane.setConstraints(colorText, 0, 3);
        GridPane.setConstraints(b1, 0, 4);
        GridPane.setConstraints(canvas, 1, 1);

        // adding spaces between radiobutton, button and radiobutton
        radioButton1.setPadding(new Insets(15));
        radioButton2.setPadding(new Insets(15));
        radioButton3.setPadding(new Insets(15));
        b1.setPadding(new Insets(15));
        colorText.setPadding(new Insets(15));

        gridPane.getChildren().addAll(radioButton1, radioButton2, radioButton3, colorText, b1, canvas);
        Scene scene = new Scene(gridPane, 800, 800);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}

1 Ответ

2 голосов
/ 21 октября 2019

Вы определяете Scene в этой части кода:

gridPane.getChildren().addAll(radioButton1, radioButton2, radioButton3, colorText, b1, canvas);
Scene scene = new Scene(gridPane, 800, 800);
primaryStage.setScene(scene);
primaryStage.show()

, но вы вызываете этот код, прежде чем определить Scene.

// scene cannot be resolved without initializing at top: Node scene;
scene.setOnMousePressed(q -> {
   gc.setFill(Color.BLACK);
   gc.setLineWidth(1); 
   gc.beginPath();
   gc.lineTo(q.getSceneX(),
   q.getSceneY());
   gc.getStroke();
});

Вам необходимо удалитьNode scene. и переместите код scene.setOnMousePressed() в место, после которого вы определили Scene.

Полный код:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TestFX extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        primaryStage.setTitle("MyPaint");

        RadioButton radioButton1 = new RadioButton("Draw");
        RadioButton radioButton2 = new RadioButton("Erase");
        RadioButton radioButton3 = new RadioButton("Circle");

        ToggleGroup radioGroup = new ToggleGroup();

        radioButton1.setToggleGroup(radioGroup);
        radioButton2.setToggleGroup(radioGroup);
        radioButton3.setToggleGroup(radioGroup);

        Button b1 = new Button("Clear Canvas");

        TextField colorText = new TextField();
        colorText.setText("Colors");

        Canvas canvas = new Canvas(300, 250);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        gc.strokeText("Hello Canvas", 150, 100);

        GridPane gridPane = new GridPane();

        GridPane.setConstraints(radioButton1, 0, 0);
        GridPane.setConstraints(radioButton2, 0, 1);
        GridPane.setConstraints(radioButton3, 0, 2);
        GridPane.setConstraints(colorText, 0, 3);
        GridPane.setConstraints(b1, 0, 4);
        GridPane.setConstraints(canvas, 1, 1);

        // adding spaces between radiobutton, button and radiobutton
        radioButton1.setPadding(new Insets(15));
        radioButton2.setPadding(new Insets(15));
        radioButton3.setPadding(new Insets(15));
        b1.setPadding(new Insets(15));
        colorText.setPadding(new Insets(15));

        gridPane.getChildren().addAll(radioButton1, radioButton2, radioButton3, colorText, b1, canvas);
        Scene scene = new Scene(gridPane, 800, 800);
        scene.setOnMousePressed(q -> {
                gc.setFill(Color.BLACK);
                gc.setLineWidth(1); 
                gc.beginPath();
                gc.lineTo(q.getSceneX(),
                q.getSceneY());
                gc.getStroke();
                });

        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

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