JavaFX,MouseEvent问题

JavaFX,MouseEvent问题,java,javafx,mouseevent,line,draw,Java,Javafx,Mouseevent,Line,Draw,我目前正在制作一个绘画应用程序,并且已经创建了几个正在工作的工具,但是我在尝试创建绘画应用程序时遇到了一个问题 “画直线”工具 所以我基本上从a点到B点画了一条线,这条线就在那里,但是,当我切换我的其他工具(绘制圆、矩形等)时,形状与直线同时绘制,尽管“绘制线”按钮被关闭 下面的代码将允许您绘制直线,您可以尝试打开和关闭不同的按钮,当您在窗格上拖动光标时,仍将绘制直线 有人知道我犯了什么样的错误,以及任何可能的修复和/或替代解决方案吗 (事件处理程序在那里,以便我可以选择绘制的形状,如果需要,可

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

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

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

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

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


}

您只需检查
鼠标单击的
处理程序(顺便说一下,这是一种按下然后释放的手势)中是否选择了
行按钮。在该处理程序中,您添加了一个按下的
鼠标
处理程序,并在该处理程序中添加了一个拖动的
鼠标
处理程序。不检查在按下的
鼠标或拖动的
鼠标处理程序中是否选择了
行按钮

这一切都意味着,在
鼠标点击
处理程序内的
条件计算为true后,您将有一个
鼠标点击
鼠标拖动
处理程序,该处理程序独立于您的
鼠标点击
处理程序运行。现在,无论何时按下任何鼠标按钮,它都会创建一个
,并将其添加到父项中。然后,新添加的
鼠标拖动
处理程序将更改

幸运的是,在某种程度上,您使用的是
onXXX
属性,而不是
addEventHandler
。设置时,这些属性将替换旧的
EventHandler
。如果没有发生这种情况(例如使用
addEventHandler
),您将有许多(每次多一个)
EventHandler
s绘图
Line
s

您只需注册所有适当的
EventHandler
s一次,并在其中执行逻辑

下面是一个小例子:

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;
  }

}

首先,请遵循java命名约定。您的
按钮
被突出显示为类,因为它以大写开头,即使它是一个变量。@Kartik感谢您,但是,我通常遵循命名约定,我只是匆忙编写了此代码,导致了一个错误:)不用担心,Upvoted非常感谢,一直在看你的代码,我对事件处理程序更加自信,它也为我提供了一个解决方案,我非常感谢你花时间帮助我,再次感谢:)
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;
  }

}