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