【问题标题】:using JavaFX controller class+ FXML + jssc ( java simple serial connector)使用 JavaFX 控制器类+ FXML + jssc(java 简单串行连接器)
【发布时间】:2016-04-15 12:37:52
【问题描述】:

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

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

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

公共类ServoCtrl实现可初始化{

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

    }

}

}

【问题讨论】:

    标签: javafx arduino fxml jssc


    【解决方案1】:

    您正在双向绑定值:

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

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

    如果您想将新的脚踝更新到您的 arduino:选择一个属性(例如,您的文本字段的 textProperty())并添加一个 ChangeListener,您可以在其中为您的 arduino 实施新的脚踝设置器。

    【讨论】:

    • 非常感谢您提供的信息。我修改了我的代码,它现在可以工作了
    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2013-12-25
    • 2016-08-20
    • 1970-01-01
    • 2017-06-29
    • 2012-09-14
    • 2018-08-03
    相关资源
    最近更新 更多