为了账号安全,请及时绑定邮箱和手机立即绑定

JavaFX,MouseEvent 问题

JavaFX,MouseEvent 问题

蓝山帝景 2021-12-30 16:33:42
我目前正在制作一个绘画应用程序并创建了几个正在运行的工具,但是在尝试创建“绘制直线”工具时遇到了问题所以我基本上画了一条从 A 点到 B 点的线并且它起作用了,这条线在那里,但是,当我切换我的其他工具(绘制圆形、矩形等)时,形状与直线同时绘制,尽管“画线”按钮被关闭。下面的代码将允许您绘制直线,您可以尝试打开和关闭不同的按钮,当您将光标拖过窗格时仍会绘制直线。任何人都知道我犯了什么样的错误,以及任何可能的修复和/或替代解决方案?(事件处理程序在那里,以便我可以选择绘制的形状,如果需要,稍后更改它们,此代码是我的绘画应用程序的精简版本)public class DrawLine extends Application {@Overridepublic 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();}}
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

如果你只检查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;

  }


}



查看完整回答
反对 回复 2021-12-30
  • 1 回答
  • 0 关注
  • 324 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号