JavaFX EventFilter实现

时间:2016-08-12 07:11:49

标签: java javafx eventfilter

我尝试过类似的实现JavaFX EventFilter

@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.对于每次额外点击,动作再次发生。 EG首先单击“HELLO”再点击“HELLO HELLO”

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

如何防止这种情况发生?

1 个答案:

答案 0 :(得分:0)

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

您可以在方法leftButton()中添加事件过滤器,该方法在您按钮的操作中调用。因此,第一次单击按钮时,没有附加事件过滤器,因此没有任何反应。

要解决此问题,您可以将代码移至initialize()或使用单独的方法放置这些代码,然后使用FXML调用它们。

开启

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

发布时

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

<Button id="leftButton" fx:id="leftButton" onMousePressed="#onPress" onMouseReleased="#onRelease"/>
  
      
  1. 对于每次额外点击,操作再次发生。 EG首先点击&#34; HELLO&#34;第二次点击&#34; HELLO HELLO&#34;
  2.   

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