- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在制作一个绘画应用程序,并创建了几个可以运行的工具,但是在尝试创建一个绘画应用程序时遇到了问题“画直线”工具
所以我基本上从 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_PRESSED
或 MOUSE_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/
我正在用 typescript 编写一个 react 应用程序,我试图同时处理右键单击和左键单击。 这是我的界面 interface ButtonProps { value: CellValu
在 Intellij 诉 2018.3.2 中。每次将 $event 传递给方法时,我都会收到此错误。 在模板中我有: {{ header }} 然后在类里面: public toggle(event
我的棋盘游戏取得进展,因此只需单击鼠标,就会执行一些任务,例如播放一些动画、接收棋盘的新 Pane (我问了我的最后一个问题,现在效果很好)、对玩家进行更改数据等 所以,这是我的事件处理程序 grid
我正在使用 Haxe+OpenFL 制作游戏。我之前曾针对 js,然后我切换到 neko,以下构造停止工作: if(e.shiftKey) do smth Ofc 自更改目标以来,我没有更改此代码
SwingUtilities 包有一个很好的函数 convertMouseEvent,可以将一个组件上的鼠标事件转换为另一个组件上的鼠标事件: MouseEvent convertedEvent =
这看起来很简单,但我无法处理这个问题我总是在控制台中收到相同的消息: Type error: Type '(event: MouseEvent) => void' is not assignable
我发生了什么事,你能告诉我2做了什么吗? 我正在创建一个需要钩子(Hook)来替换状态的网站。我在我的index.js 上。错误发生在菜单内 div 内的 onClicks 上。菜单来自materia
我正在尝试使用 openCVsharp 方法在 c# 中获取鼠标位置并在 c# 中打开窗口。 首先我定义一个回调函数: public void mc(MouseEvent me, int x, int
我正在处理一个正在编写的程序,我需要能够检测鼠标何时离开窗口/ Canvas 。但是,据我所知,处理没有任何类似于 mouseOut 事件的内容。有什么方法可以使用回调或事件或类似性质的东西来完成此任
我正在编写一个正在处理的程序,我需要能够检测鼠标何时离开窗口/ Canvas 。然而,据我所知,processing 没有任何类似于 mouseOut 事件的东西。有什么方法可以使用回调或事件或类似性
Visual Studio Code 显示目标变量是 EventTarget输入以下 TypeScript 代码: document.addEventListener('click', (event)
如果尝试在QML定义的信号中将MouseEvent用作arg,则在加载时会出现以下错误: Invalid signal parameter type: MouseEvent Qt文档中与此有关的信息存
是否可以在Openlayer3上获得鼠标右键单击事件?如果是这样,我如何获得右键单击位置的纬度和经度。 我通过以下方式获得了右键单击事件 map.getViewport().addEventListe
我希望在 Gtk::DrawableArea 上使用 mouseevents 画一条线。我想要的是这样的: 点击线路按钮激活线路事件 选择绘图区域中的第一个点(已绘制) 现在选择绘图区域中的第二个点(
程序涉及到EventHandlers和MouseEvents的应用。该程序的目标是呈现一个空白场景,用户可以左键单击(主要)并向事件发生时鼠标所在的场景添加一个圆形对象。可以添加的圈数无关紧要。当用户
我正在尝试为单元测试创建带有某些修饰符的 MouseEvent。我使用的是 J2SE,以下代码无法通过: public void testMouseEventProblem() { Mouse
我有一个使用自己的 AS3 类构建的菜单,当单击此菜单中的链接时,它会根据从外部 XML 文件传入的一些变量触发一个函数。 菜单由四个小节组成,我希望用户能够从与该菜单完全分开的按钮跳转到该小节的父级
我有两个相交的矩形。当鼠标悬停在它们上方时,我希望两者的不透明度都发生变化。当鼠标悬停在其中一个上时它会起作用。但是当鼠标在矩形的交叉区域时,只有上面的矩形改变了它的不透明度。你能告诉我在这种情况下如
这是带有行单击的 JavaFX 表的基本示例: public class MainApp extends Application { private TableView table =
标题设法提出了大部分问题,但是,我很好奇使用 LMB 单击的哪一部分会触发视觉突出显示。 我所说的视觉突出显示是蓝色框(如果您使用默认设置),它显示您选择的文本,以便您可以看到它。据我所知,实际的选择
我是一名优秀的程序员,十分优秀!