使用 JavaFX 控制器 class+ FXML + jssc(java 简单串行连接器)

using JavaFX controller class+ FXML + jssc ( java simple serial connector)

我正在开发一个简单的应用程序,使用 JavaFX 和控制器 class 以及 FXML 和 Jssc 来控制 arduino。 arduino 连接到 sg90 伺服电机和 LED。

我在使用滑块控制伺服电机时遇到问题。我想用滑块来控制伺服电机的角度,每当我拖动滑块拇指时,伺服会不断更新它的角度。

这是控制器class代码可以工作,但问题是我不知道如何实现滑块和伺服的控制。

public class ServoCtrl 实现 Initializable {

@FXML
private Button IncrBtn = new Button();
@FXML
private Button DecrBtn = new Button();
@FXML
private ToggleButton toggleConnectSerial = new ToggleButton();
@FXML
private ToggleButton lightSwitcH = new ToggleButton();
@FXML
private Slider AngleSlider = new Slider(0, 180, 90);
@FXML
private TextField tfAngle = new TextField();
@FXML
private TextField tfSteps = new TextField();

SerialPort ServoSerialPort;

private int tempstr = 0;

@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub
    tfAngle.textProperty().bindBidirectional(AngleSlider.valueProperty(), NumberFormat.getIntegerInstance());

    //disable all port when starting the application
    AngleSlider.setDisable(true);
    lightSwitcH.setDisable(true);
    IncrBtn.setDisable(true);
    DecrBtn.setDisable(true);
    tfAngle.setDisable(true);
    tfSteps.setDisable(true);

}

/*--------- increase or decrease slider value using buttons---------------------------------*/

public void IncrBtnPress(ActionEvent btnIncr) {

    tempstr = Integer.parseInt(tfSteps.getText());
    AngleSlider.setValue(Integer.parseInt(tfAngle.getText()) + tempstr);
    tfAngle.setText(Integer.toString((int) AngleSlider.getValue()));
}

public void DecrBtnPress(ActionEvent btnDecr) {
    tempstr = Integer.parseInt(tfSteps.getText());
    AngleSlider.setValue(Integer.parseInt(tfAngle.getText()) - tempstr);
    tfAngle.setText(Integer.toString((int) AngleSlider.getValue()));

}

/*-----------toggle Switch on light-----------------------------------*/

public void lightSwitch(ActionEvent eve) {
    try {
        if (lightSwitcH.isSelected() == true) {
            lightSwitcH.setText("OFF");

            /*
             * send the following string commands 3 = led number 1 = On, 0 =
             * Off / = seperator - = wait for next command
             * 
             */
            // turn on led
            ServoSerialPort.writeString("3/1-");
        } else {
            // turn off led
            lightSwitcH.setText("ON");
            ServoSerialPort.writeString("3/0-");
        }
    }
     catch (SerialPortException e) {
        e.printStackTrace();
    }
}

/*-------------------- connect or disconnect port-------------------------*/
public void toggleConnect(ActionEvent tgle) {

    if (toggleConnectSerial.isSelected() == true) {

        // enable control when serial port is connected 
        AngleSlider.setDisable(false);
        lightSwitcH.setDisable(false);
        IncrBtn.setDisable(false);
        DecrBtn.setDisable(false);
        tfAngle.setDisable(false);
        tfSteps.setDisable(false);

        // set the port name
        ServoSerialPort = new SerialPort("COM8");
        try {
            // set the toggle button text to disconnect
            toggleConnectSerial.setText("Disconnect");
            // open the serial port
            ServoSerialPort.openPort();
            // set the port parameters
            ServoSerialPort.setParams(SerialPort.BAUDRATE_115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);


        } catch (SerialPortException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }

    } else {
        // disable all control when port is disconnected
        AngleSlider.setDisable(true);
        lightSwitcH.setDisable(true);
        IncrBtn.setDisable(true);
        DecrBtn.setDisable(true);
        tfAngle.setDisable(true);
        tfSteps.setDisable(true);
        toggleConnectSerial.setText("Connect");
        try {
            ServoSerialPort.closePort();
        } catch (SerialPortException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

}

您正在双向绑定值:

tfAngle.textProperty().bindBidirectional(AngleSlider.valueProperty(), NumberFormat.getIntegerInstance());

这意味着如果 textfieldslider 发生变化,属性 已经更新 - 其他组件会自动更新。因此,像 IncrBtnPress 这样的方法不应更新两个值,而应只更新一个值:slidertextField.

如果你想更新你的arduino脚踝:选择一个属性(例如你的文本字段的textProperty())并添加一个ChangeListener,你可以在其中实现你的新脚踝ankle-Setter 给你的 arduino。