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