gpt4 book ai didi

JavaFX、MouseEvent问题

转载 作者:行者123 更新时间:2023-11-30 02:00:09 25 4
gpt4 key购买 nike

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

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

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

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

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

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

}

最佳答案

您只需检查 lineButton 是否在 MOUSE_CLICKED(顺便说一下,这是一个按下然后释放的手势)处理程序中被选中。在此处理程序中,您添加一个 MOUSE_PRESSED 处理程序,在该处理程序中您添加一个 MOUSE_DRAGGED 处理程序。您不会检查 lineButton 是否在 MOUSE_PRESSEDMOUSE_DRAGGED 处理程序中被选中。

这一切意味着,在 MOUSE_CLICKED 处理程序中的 if 条件计算结果为 true 后,您将获得一个 MOUSE_PRESSED 并且MOUSE_DRAGGED 处理程序独立于 MOUSE_CLICKED 处理程序运行。现在,每当您按下任何鼠标按钮时,它都会创建一个Line并将其添加到父级。然后新添加的 MOUSE_DRAGGED 处理程序将更改 Line

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

您只需注册所有适当的 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;
}

}

关于JavaFX、MouseEvent问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53147393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com