JavaFX,MouseEvent 问题

我目前正在制作一个绘画应用程序并创建了几个正在运行的工具,但是在尝试创建“绘制直线”工具时遇到了问题


所以我基本上画了一条从 A 点到 B 点的线并且它起作用了,这条线在那里,但是,当我切换我的其他工具(绘制圆形、矩形等)时,形状与直线同时绘制,尽管“画线”按钮被关闭。


下面的代码将允许您绘制直线,您可以尝试打开和关闭不同的按钮,当您将光标拖过窗格时仍会绘制直线。


任何人都知道我犯了什么样的错误,以及任何可能的修复和/或替代解决方案?


(事件处理程序在那里,以便我可以选择绘制的形状,如果需要,稍后更改它们,此代码是我的绘画应用程序的精简版本)


public class DrawLine extends Application {



@Override

public void start(Stage primaryStage) {


    ToggleButton lineButton  =   new    ToggleButton    ("Draw Line");

    ToggleButton Button      =   new    ToggleButton    ("Button with no function");


    BorderPane pane = new BorderPane();

    ToolBar toolbar = new ToolBar();

    Scene scene = new Scene(pane, 1200, 800);

    pane.setLeft(toolbar);

    toolbar.getItems().addAll(lineButton, Button);



    // Draw Line

    scene.addEventHandler(MouseEvent.MOUSE_CLICKED, me -> { 

        if(lineButton.isSelected() & me.getButton().equals(MouseButton.PRIMARY) ) { 

            scene.setOnMousePressed(event -> {

                Line line = new Line();


                line.setStartX(event.getX());

                line.setStartY(event.getY());


                    scene.setOnMouseDragged(e->{


                        line.setEndX(e.getX());

                        line.setEndY(e.getY());

                        });


                    pane.getChildren().add(line);


                });

        }

    });



    primaryStage.setTitle("Paint App"); 

    primaryStage.setScene(scene);       

    primaryStage.show();                 

}


public static void main(String[] args) {

    launch();

}

}


蓝山帝景
浏览 325回答 1
1回答

吃鸡游戏

如果你只检查lineButton被内选择MOUSE_CLICKED(这是一个压然后释放的手势,顺便)处理。在这个处理程序中添加一个MOUSE_PRESSED处理程序,然后在该处理程序中添加一个MOUSE_DRAGGED处理程序。您不检查或处理程序中lineButton是否选择了。MOUSE_PRESSEDMOUSE_DRAGGED这一切意味着,在处理程序中的if条件MOUSE_CLICKED评估为真后,您将拥有独立于您的处理程序运行的MOUSE_PRESSEDandMOUSE_DRAGGED处理程序。现在,每当您按下任何鼠标按钮时,它都会创建一个并将其添加到父级。然后新添加的处理程序将更改.MOUSE_CLICKEDLineMOUSE_DRAGGEDLine在某种程度上,您很幸运,您使用的是onXXX属性而不是addEventHandler. 这些属性EventHandler在设置时替换旧的。如果那没有发生(例如使用addEventHandler),您将有很多(每次多一个)EventHandlers 绘图Lines。你只需要注册所有适当的EventHandler小号一次,做他们的逻辑里。这是一个小例子:import javafx.application.Application;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.ToggleButton;import javafx.scene.control.ToggleGroup;import javafx.scene.control.ToolBar;import javafx.scene.input.MouseButton;import javafx.scene.input.MouseEvent;import javafx.scene.layout.BorderPane;import javafx.scene.layout.Pane;import javafx.scene.shape.Line;import javafx.stage.Stage;public class Main extends Application {  private ToggleGroup toggleGroup;  private ToggleButton lineBtn;  private Group group;  private Line currentLine;  @Override  public void start(Stage primaryStage) {    toggleGroup = new ToggleGroup();    lineBtn = new ToggleButton("Line");    ToggleButton noneBtn = new ToggleButton("None");    toggleGroup.getToggles().addAll(lineBtn, noneBtn);    toggleGroup.selectToggle(noneBtn);    group = new Group();    BorderPane root = new BorderPane(new Pane(group), new ToolBar(lineBtn, noneBtn), null, null, null);    root.getCenter().setOnMousePressed(this::handleMousePressed);    root.getCenter().setOnMouseDragged(this::handleMouseDragged);    root.getCenter().setOnMouseReleased(this::handleMouseReleased);    primaryStage.setScene(new Scene(root, 800, 600));    primaryStage.setTitle("Draw Shape Example");    primaryStage.show();  }  private void handleMousePressed(MouseEvent event) {    if (lineBtn.equals(toggleGroup.getSelectedToggle())        && event.getButton() == MouseButton.PRIMARY) {      currentLine = new Line(event.getX(), event.getY(), event.getX(), event.getY());      group.getChildren().add(currentLine);    }  }  private void handleMouseDragged(MouseEvent event) {    if (currentLine != null) {      currentLine.setEndX(event.getX());      currentLine.setEndY(event.getY());    }  }  private void handleMouseReleased(MouseEvent event) {    if (currentLine != null         && currentLine.getStartX() == currentLine.getEndX()        && currentLine.getStartY() == currentLine.getEndY()) {      // The line has no length, remove it      group.getChildren().remove(currentLine);    }    currentLine = null;  }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java