Créer un contrôleur radio Ev3 avec JavaFx et leJOS [Partie 2]

introduction

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]

Aperçu

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) IMAGE ALT TEXT HERE

programme

La structure des fichiers est la suivante. Le nom du projet est JavaFxEv3. スクリーンショット 2017-03-13 23.17.58.png

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>

Commentaire

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. スクリーンショット 2017-03-18 12.51.02.png

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

Commentaire

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

Commentaire

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

Résumé

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

Créer un contrôleur radio Ev3 avec JavaFx et leJOS [Partie 2]
Créer un contrôleur radio Ev3 avec JavaFx et leJOS [Partie 1]
[LeJOS] Contrôlons le moteur EV3 avec Java
[LeJOS] Contrôlons à distance le moteur EV3 avec Java
Premiers pas avec Java et création d'un éditeur Ascii Doc avec JavaFX
Créer un outil de diaporama avec JavaFX
Bonjour tout le monde avec Kotlin et JavaFX
Faites glisser et déposez des fichiers avec JavaFX
Comment créer une application avec un mécanisme de plug-in [C # et Java]
Agrandir / réduire et mouvement parallèle avec JavaFX Canvas (Revenge)
Téléchargez JDK avec Gradle et créez JRE
Faisons un écran d'erreur avec Rails