JavaFx,如何添加menuBar和drawingPane

JavaFx, how to add menuBar and drawingPane

我正忙着做一些演示,在卷轴上画一些线 window。到目前为止一切顺利,但现在可以在 menuBar 上绘制线条,这当然是不可能的。请参阅下面的代码。请帮忙!

事情是这样的:

See output here

错误代码:

package Example12a;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class Example12a extends Application {

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

    private Line curLine;

    @Override
    public void start(Stage stage) throws Exception {
        Pane drawingPane = new Pane();
        BorderPane theBorderPane = new BorderPane();

        drawingPane.setPrefSize(800, 800);
        drawingPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

        MenuBar menuBar = new MenuBar();
        // --- Menu File
        Menu menuFile = new Menu("File");
        MenuItem add = new MenuItem("Save");
        add.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent t) {
                System.out.println("Save");
            }
        }); 
        menuFile.getItems().addAll(add);
        //yOffset = (int)menuBar.getHeight();        
        Menu menuEdit = new Menu("Edit");
        Menu menuView = new Menu("View");
        menuBar.getMenus().addAll(menuFile, menuEdit, menuView);
        theBorderPane.setTop(menuBar);

        ScrollPane scrollPane = new ScrollPane(theBorderPane);
        scrollPane.setPrefSize(300, 300);
        scrollPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        scrollPane.setFitToWidth(true);
        scrollPane.setFitToHeight(true);
        scrollPane.setStyle("-fx-focus-color: transparent;");

        theBorderPane.setOnMousePressed(event -> {
            if (!event.isPrimaryButtonDown()) {
                return;
            }

            curLine = new Line(
                event.getX(), event.getY(), 
                event.getX(), event.getY()
            );
            theBorderPane.getChildren().add(curLine);
        });

        theBorderPane.setOnMouseDragged(event -> {
            if (!event.isPrimaryButtonDown()) {
                return;
            }

            if (curLine == null) {
                return;
            }

            curLine.setEndX(event.getX());
            curLine.setEndY(event.getY());

            double mx = Math.max(curLine.getStartX(), curLine.getEndX());
            double my = Math.max(curLine.getStartY(), curLine.getEndY());

            if (mx > theBorderPane.getMinWidth()) {
                theBorderPane.setMinWidth(mx);
            }

            if (my > theBorderPane.getMinHeight()) {
                theBorderPane.setMinHeight(my);
            }
        });

        theBorderPane.setOnMouseReleased(event -> curLine = null);

        theBorderPane.setCenter(drawingPane);
        Scene scene = new Scene(scrollPane);
        stage.setMinWidth(100);
        stage.setMinHeight(100);
        stage.setScene(scene);

        stage.show();
    }
}

修复了您的布局。

我所做的是:

BorderPane 现在是您的根窗格。

ScrollPane是BorderPane的中心,其内容是drawingPane

MenuBar 仍然位于 BorderPane 的顶部。

我还将鼠标事件从 borderPane 更改为 drawingPane,并将线条添加到 drawingPane 而不是 borderPane。

所以它工作正常。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class Example12a extends Application {

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

    private Line curLine;

    @Override
    public void start(Stage stage) throws Exception {
        Pane drawingPane = new Pane();
        BorderPane theBorderPane = new BorderPane();

        drawingPane.setPrefSize(800, 800);
        drawingPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

        MenuBar menuBar = new MenuBar();
        // --- Menu File
        Menu menuFile = new Menu("File");
        MenuItem add = new MenuItem("Save");
        add.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent t) {
                System.out.println("Save");
            }
        }); 
        menuFile.getItems().addAll(add);
        //yOffset = (int)menuBar.getHeight();        
        Menu menuEdit = new Menu("Edit");
        Menu menuView = new Menu("View");
        menuBar.getMenus().addAll(menuFile, menuEdit, menuView);
        theBorderPane.setTop(menuBar);

        ScrollPane scrollPane = new ScrollPane(drawingPane);
        scrollPane.setPrefSize(300, 300);
        scrollPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        scrollPane.setFitToWidth(true);
        scrollPane.setFitToHeight(true);
        scrollPane.setStyle("-fx-focus-color: transparent;");

        drawingPane.setOnMousePressed(event -> {
            if (!event.isPrimaryButtonDown()) {
                return;
            }

            curLine = new Line(
                event.getX(), event.getY(), 
                event.getX(), event.getY()
            );
            drawingPane.getChildren().add(curLine);
        });

        drawingPane.setOnMouseDragged(event -> {
            if (!event.isPrimaryButtonDown()) {
                return;
            }

            if (curLine == null) {
                return;
            }

            curLine.setEndX(event.getX());
            curLine.setEndY(event.getY());

            double mx = Math.max(curLine.getStartX(), curLine.getEndX());
            double my = Math.max(curLine.getStartY(), curLine.getEndY());

            if (mx > drawingPane.getMinWidth()) {
                drawingPane.setMinWidth(mx);
            }

            if (my > drawingPane.getMinHeight()) {
                drawingPane.setMinHeight(my);
            }
        });

        theBorderPane.setOnMouseReleased(event -> curLine = null);

        theBorderPane.setCenter(scrollPane);
        Scene scene = new Scene(theBorderPane);
        stage.setMinWidth(100);
        stage.setMinHeight(100);
        stage.setScene(scene);

        stage.show();
    }
}

注:

如果你想制作一个绘图程序,我会优先渲染 Canvas 中的所有线条,而不是使用 class 线条。 Canvas 有很多行要快得多。