Cet article suppose que vous disposez d'un environnement de développement leJOS. Veuillez consulter cet article pour plus de détails.
[LeJOS] Programmons mindstorm-EV3 avec Java [Construction de l'environnement première partie]
[LeJOS] Programmons mindstorm-EV3 avec Java [Construction de l'environnement partie 2]
Cet article est une suite de l'article suivant: J'expliquerai le développement d'une application GUI qui contrôle Ev3 en utilisant la classe de télécommande remoteEv3 de leJOS et JavaFx.
Création d'un contrôleur radio Ev3 avec JavaFx et leJOS [Partie 1]
Celle créée cette fois est une simple application de radiocommande. (Cliquez pour lire la vidéo)
La structure des fichiers est la suivante. Le nom du projet est JavaFxEv3.
Form.fxml Écrivez le GUI ici. Vous pouvez le modifier à l'aide de SceneBuilder.
Form.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.Pane?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.FormController">
<children>
<Button fx:id="LeftButton" layoutX="100.0" layoutY="180.0" mnemonicParsing="false" onMousePressed="#LeftButtonPressed" onMouseReleased="#LeftButtonReleased" prefHeight="40.0" prefWidth="100.0" text="Left" />
<Button fx:id="RightButton" layoutX="400.0" layoutY="180.0" mnemonicParsing="false" onMousePressed="#RightButtonPressed" onMouseReleased="#RightButtonReleased" prefHeight="40.0" prefWidth="100.0" text="Right" />
<Button fx:id="ForwardButton" layoutX="250.0" layoutY="62.0" mnemonicParsing="false" onMousePressed="#ForwardButtonPressed" onMouseReleased="#ForwardButtonReleased" prefHeight="40.0" prefWidth="100.0" text="Forward" />
<Button fx:id="BackwardButton" layoutX="250.0" layoutY="300.0" mnemonicParsing="false" onMousePressed="#BackwardButtonPressed" onMouseReleased="#BackwardButtonReleased" prefHeight="40.0" prefWidth="100.0" text="Backward" />
</children>
</Pane>
Chaque bouton a une méthode enregistrée qui est appelée lorsque la souris est enfoncée et lorsque la souris est relâchée. Enregistrez la méthode lorsque le bouton est enfoncé dans onMousePressed et la méthode lorsque le bouton est relâché dans onMouseReleased.
application.css Vous pouvez styliser l'interface graphique.
application.css
/*Réglage de la couleur d'arrière-plan*/
.root{
-fx-background-color: white;
}
/*Paramètres de couleur des boutons*/
.button {
-fx-background-color: slateblue; -fx-text-fill: white;
}
/*Réglage de la couleur lorsque le bouton de la souris est sur*/
.button:hover{
-fx-background-color: green; -fx-text-fill: white;
}
Main.java
Main.java
package application;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import lejos.remote.ev3.RMIRegulatedMotor;
import lejos.remote.ev3.RemoteEV3;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.fxml.FXMLLoader;
public class Main extends Application {
public RemoteEV3 ev3 = null;
public RMIRegulatedMotor leftMotor = null;
public RMIRegulatedMotor rightMotor = null;
@Override
public void start(Stage primaryStage) {
try {
//Instanciation pour télécommande
ev3 = new RemoteEV3("192.168.2.91");
ev3.setDefault();
//Création d'objet moteur
leftMotor = ev3.createRegulatedMotor("A", 'L');
rightMotor = ev3.createRegulatedMotor("B", 'L');
} catch (RemoteException | MalformedURLException | NotBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Form.fxml"));
Pane root = (Pane)loader.load();
Scene scene = new Scene(root,600,400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
//Passer l'objet moteur au contrôleur
FormController controller = loader.getController();
controller.setThisLeftMotor(leftMotor);
controller.setThisRightMotor(rightMotor);
//Écran d'affichage
primaryStage.setScene(scene);
primaryStage.show();
//Traitement lorsque l'écran est fermé
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent we) {
System.out.println("Stage is closing");
try {
leftMotor.close();
rightMotor.close();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
Créez un objet pour accéder au moteur à l'aide de la classe RemoteEv3.
ev3 = new RemoteEV3("192.168.2.91");
ev3.setDefault();
//Création d'objet moteur
leftMotor = ev3.createRegulatedMotor("A", 'L');
rightMotor = ev3.createRegulatedMotor("B", 'L');
Passez l'objet moteur au contrôleur.
//Passer l'objet moteur au contrôleur
FormController controller = loader.getController();
controller.setThisLeftMotor(leftMotor);
controller.setThisRightMotor(rightMotor);
Assurez-vous de fermer l'accès au moteur à la fin du programme. Si ce n'est pas défini, une erreur se produira au redémarrage du programme.
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent we) {
System.out.println("Stage is closing");
try {
leftMotor.close();
rightMotor.close();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
FormController.java C'est la partie contrôleur. Associez l'interface graphique à la méthode.
FormController.java
package application;
import java.rmi.RemoteException;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import lejos.remote.ev3.RMIRegulatedMotor;
public class FormController {
public RMIRegulatedMotor thisLeftMotor = null;
public RMIRegulatedMotor thisRightMotor = null;
public void setThisLeftMotor(RMIRegulatedMotor leftMotor) {
thisLeftMotor = leftMotor;
}
public void setThisRightMotor(RMIRegulatedMotor rightMotor) {
thisRightMotor = rightMotor;
}
@FXML
Button LeftButton;
@FXML
Button RightButton;
@FXML
Button ForwardButton;
@FXML
Button BackwardButton;
@FXML
void initialize() {
System.out.println("Processus d'initialisation");
}
@FXML
public void LeftButtonPressed(MouseEvent actionEvent) {
try {
thisLeftMotor.forward();
thisRightMotor.backward();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@FXML
public void LeftButtonReleased(MouseEvent actionEvent) {
try {
thisLeftMotor.stop(true);
thisRightMotor.stop(true);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@FXML
public void RightButtonPressed(MouseEvent actionEvent) {
try {
thisLeftMotor.backward();
thisRightMotor.forward();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@FXML
public void RightButtonReleased(MouseEvent actionEvent) {
try {
thisLeftMotor.stop(true);
thisRightMotor.stop(true);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@FXML
public void ForwardButtonPressed(MouseEvent actionEvent) {
try {
thisLeftMotor.forward();
thisRightMotor.forward();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@FXML
public void ForwardButtonReleased(MouseEvent actionEvent) {
try {
thisLeftMotor.stop(true);
thisRightMotor.stop(true);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@FXML
public void BackwardButtonPressed(MouseEvent actionEvent) {
try {
thisLeftMotor.backward();
thisRightMotor.backward();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@FXML
public void BackwardButtonReleased(MouseEvent actionEvent) {
try {
thisLeftMotor.stop(true);
thisRightMotor.stop(true);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Définissez un poseur pour accéder à l'objet moteur depuis le contrôleur.
public void setThisLeftMotor(RMIRegulatedMotor leftMotor) {
thisLeftMotor = leftMotor;
}
public void setThisRightMotor(RMIRegulatedMotor rightMotor) {
thisRightMotor = rightMotor;
}
Par exemple, le code suivant définit la méthode LeftButtonPressed qui est appelée lorsque le LeftButton est enfoncé et la méthode LeftButtonReleased qui est appelée lorsque le LeftButton est relâché.
@FXML
public void LeftButtonPressed(MouseEvent actionEvent) {
try {
thisLeftMotor.forward();
thisRightMotor.backward();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@FXML
public void LeftButtonReleased(MouseEvent actionEvent) {
try {
thisLeftMotor.stop(true);
thisRightMotor.stop(true);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
J'ai présenté comment développer une application GUI en utilisant la classe RemoteEv3 de JavaFx et leJOS. Si vous l'utilisez, vous pouvez également obtenir la valeur du capteur et la visualiser sur l'interface graphique. Veuillez également vous référer à cet article concernant la classe RemoteEv3.
[LeJOS] Contrôlons à distance le moteur EV3 avec Java
[LeJOS] Obtenir la valeur du capteur EV3 à distance avec Java
Recommended Posts