使用 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());
这意味着如果 textfield
或 slider
发生变化,属性 已经更新 - 其他组件会自动更新。因此,像 IncrBtnPress
这样的方法不应更新两个值,而应只更新一个值:slider
或 textField
.
如果你想更新你的arduino脚踝:选择一个属性(例如你的文本字段的textProperty()
)并添加一个ChangeListener
,你可以在其中实现你的新脚踝ankle-Setter 给你的 arduino。
我正在开发一个简单的应用程序,使用 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());
这意味着如果 textfield
或 slider
发生变化,属性 已经更新 - 其他组件会自动更新。因此,像 IncrBtnPress
这样的方法不应更新两个值,而应只更新一个值:slider
或 textField
.
如果你想更新你的arduino脚踝:选择一个属性(例如你的文本字段的textProperty()
)并添加一个ChangeListener
,你可以在其中实现你的新脚踝ankle-Setter 给你的 arduino。