首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX EventFilter实现

JavaFX EventFilter实现
EN

Stack Overflow用户
提问于 2016-08-12 15:11:49
回答 2查看 527关注 0票数 1

我已经尝试实现了类似下面这样的JavaFX EventFilter

代码语言:javascript
复制
@FXML
public void leftButton() {
    leftButton.addEventFilter(MouseEvent.MOUSE_PRESSED,
        new EventHandler < MouseEvent > () {

            @Override
            public void handle(MouseEvent event) {
                try {
                    System.out.println("Left Button pressed, String: " + leftString);
                    byte[] command = {
                        (byte) startTx, address, byteOne, panLeft, speedNormal, 0x00, endTx, 0x2B
                    };
                    //byte[] bytes = DatatypeConverter.parseHexBinary(upString);
                    TwoWaySerialComm.SerialWriter sw = new TwoWaySerialComm.SerialWriter(
                        twoWaySerCom.serialPort.getOutputStream());

                    sw.out.write(command);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

    leftButton.addEventFilter(MouseEvent.MOUSE_RELEASED,
        new EventHandler < MouseEvent > () {

            public void handle(MouseEvent event) {
                try {
                    System.out.println("Left Button released, String: " + stopString);
                    byte[] command = {
                        (byte) startTx, address, byteOne, 0x00, 0x00, 0x00, (byte) endTx, 0x0F
                    };

                    TwoWaySerialComm.SerialWriter sw = new TwoWaySerialComm.SerialWriter(
                        twoWaySerCom.serialPort.getOutputStream());
                    sw.out.write(command);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
}

以便在单击Button时通过串行端口写入一个字符串,并在释放Button时发送一个不同字符串。

我有两个问题1.当我第一次打开应用程序时,我必须按Button两次才能发生任何事情2.每多点击一次,动作就会再次发生。例如,第一次点击"HELLO“,第二次点击" HELLO”

我怀疑我的问题是第一次单击注册了EventFilter,然后每个后续事件都创建了一个新的EventFilter

如何防止这种情况发生?

EN

回答 2

Stack Overflow用户

发布于 2016-08-12 16:04:05

  1. 当我第一次打开应用程序时,我必须按两次按钮才会发生任何事情

您可以在leftButton()方法中添加事件过滤器,该方法在按钮的操作上调用。因此,当您第一次单击您的按钮时,没有事件过滤器附加到它,因此什么也不会发生。

要克服这个问题,您可以将代码移动到initialize(),或者使用单独的方法放置这些代码,然后使用FXML调用它们。

新闻上的

代码语言:javascript
复制
public void onPress() {
    try {
         System.out.println("Left Button pressed, String: " + leftString);
         byte[] command = { (byte) startTx, address, byteOne, panLeft, speedNormal, 0x00, endTx, 0x2B };
         TwoWaySerialComm.SerialWriter sw = new TwoWaySerialComm.SerialWriter(
         twoWaySerCom.serialPort.getOutputStream());
         sw.out.write(command);
    } catch (IOException e) {
         e.printStackTrace();
    }
}

Release上的

代码语言:javascript
复制
public void onRelease() {
    try {
        System.out.println("Left Button released, String: " + stopString);
        byte[] command = {(byte) startTx, address, byteOne, 0x00, 0x00, 0x00, (byte) endTx, 0x0F};
        TwoWaySerialComm.SerialWriter sw = new TwoWaySerialComm.SerialWriter(twoWaySerCom.serialPort.getOutputStream());
        sw.out.write(command);
    } catch (IOException e) {
         e.printStackTrace();
    }
}

FXML

代码语言:javascript
复制
<Button id="leftButton" fx:id="leftButton" onMousePressed="#onPress" onMouseReleased="#onRelease"/>

  1. 每多点击一次,操作就会再次发生。例如,第一次点击“你好”,第二次点击“你好”

虽然,我不确定,但您似乎正在写入相同的流,因此附加您的数据。

票数 0
EN

Stack Overflow用户

发布于 2016-08-12 16:10:25

如果您确实需要event filters,则需要将leftButton()方法中的代码移动到initialize方法中。否则,该方法将在每次调用时添加额外的侦听器。

代码语言:javascript
复制
@FXML
private initialize() {
    leftButton.addEventFilter(MouseEvent.MOUSE_PRESSED,
       ...
    );

    leftButton.addEventFilter(MouseEvent.MOUSE_RELEASED,
        ...
    );
}

如果事件处理程序足够,则创建2个处理程序,并从fxml中注册它们:

代码语言:javascript
复制
@FXML
private void leftButtonPressed() {
    ...
}

@FXML
private void leftButtonReleased() {
    ...
}
代码语言:javascript
复制
<Button fx:id="leftButton" onMousePressed="#leftButtonPressed" onMouseReleased="#leftButtonReleased"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38911990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档