Partage
  • Partager sur Facebook
  • Partager sur Twitter

Java fx8.

    26 mai 2016 à 23:22:22

    Salut à tous, j'essaye de comprendre comment ça fonctionne, mais j'ai un peux de mal =D

    Donc voici en faite je fais un démineur avec scene builder, je fais ma scene et ma barre de menu sans trop de problème  à part que je n'arrive pas a leurs assigner un controlleur l'emplacement il n'y a rien faut t'il faire une action spécial?

    Pour mon gridpane qui doit être de 9x9 je crée une classe qui fera le grid et qui le remplira de bouton, voici le code de cette classe.

    package Vue;
    
    import javafx.scene.control.Button;
    import javafx.scene.layout.ColumnConstraints;
    import javafx.scene.layout.GridPane;
    import javafx.scene.layout.RowConstraints;
    
    public class button {
    	final int nbc = 9;
    	final int nbl = 9;
    	public GridPane grid;
    
    	public button() {
    		
    	}
    	
    	
    	public void initBouton(){
    		// TODO Auto-generated constructor stub
    
    		Button b;
    		grid = new GridPane(); // création du grid pane
    		for (int i = 0; i < nbl; i++) {
    
    			RowConstraints ligne = new RowConstraints(); // création d'une ligne
    			ligne.setPercentHeight(100.0 / nbc);
    			grid.getRowConstraints().add(ligne); // placement des ligne dans le
    													// grid
    
    		}
    		for (int i = 0; i < nbl; i++) {
    
    			ColumnConstraints collonne = new ColumnConstraints();
    			collonne.setPercentWidth(100.0 / nbl);
    			grid.getColumnConstraints().add(collonne);
    
    		}
    
    		for (int i = 0; i < nbc; i++) {
    			for (int j = 0; j < nbl; j++) {
    
    				grid.add(b = new Button(), i, j); // placement des bouton
    				b.setPrefSize(100000, 10000); // grande taille vu que les bouton sont dans le grid
    												
    			}
    		}
    
    	}
    
    }
    

    Du coups le voila fais, mais pas encore affichable et c'est ça qui m'ennuie voici mon main javafx. Je me suis fortement inspirer d'un tuto sur internet.

    J'utiliser FXMLLoader pour mes fichier XML, mais pour le bouton que je fais à la main comment l'afficher?

    package application;
    
    import java.io.IOException;
    import Vue.button;
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Stage;
    
    public class MainDemineur extends Application {
    	private Stage primaryStage;
    	private BorderPane rootLayout;
    
    	@Override
    	public void start(Stage primaryStage) {
    		this.primaryStage = primaryStage;
    		this.primaryStage.setTitle("Plateau");
    
    		initRootLayout();
    		plateau();
    		//initBouton();
    
    	}
    
    	public void initRootLayout() {
    		try {
    			// Load root layout from fxml file.
    			FXMLLoader loader = new FXMLLoader();
    			loader.setLocation(MainDemineur.class.getResource("/Vue/RootLayout.fxml"));
    			rootLayout = (BorderPane) loader.load();
    
    			// Show the scene containing the root layout.
    			Scene scene = new Scene(rootLayout);
    			primaryStage.setScene(scene);
    			primaryStage.show();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public void plateau() {
    		try {
    			// Load plateau.
    			FXMLLoader loader = new FXMLLoader();
    			loader.setLocation(MainDemineur.class.getResource("/Vue/Plateau.fxml"));
    			AnchorPane plateau = (AnchorPane) loader.load();
    
    			// Set person overview into the center of root layout.
    			rootLayout.setCenter(plateau);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public Stage getPrimaryStage() {
    		return primaryStage;
    	}
    
    	public static void main(String[] args) {
    		launch(args);
    	}
    }
    

    j'ai un controlleur (vide) car je comprend pas encore trop les mécanisme de se controlleur en fait :D voici quand même le code.

    package Vue;
    import application.MainDemineur;
    
    import Vue.button;
    public class Controlleur {
    	
    	
    	
    	private MainDemineur mainApp;
    
    	public Controlleur() {
    		// TODO Auto-generated constructor stub
    		
    		
    		
    	}
    	
    	 public void setMainApp(MainDemineur mainApp) {
    	        this.mainApp = mainApp;
    	
    	 }
    }
    

    Merci de vos réponse :)



    • Partager sur Facebook
    • Partager sur Twitter
      27 mai 2016 à 0:19:46

      Bonsoir,

      La minute casse pieds

      J'ai un petit "test" à te faire faire sur les conventions de nommage :

      public class test{
          public static void test(){
              System.out.println("Methode de classe");
          }
      
          public void test(){
              System.out.println("Methode d'instance");
          }
      
          public static void main(String[] args){
              test test = new test();
              test.test();
          }
      }

      Qu'est-ce que ça affiche dans la console ? Car moi je suis incapable de le dire...

      Une classe commence toujours par une majuscule. Un package est toujours en minuscule et s'écrit comme un nom de domaine mais à l'envers : fr.don_raftapss.demineur.vue

      Le pattern MVC en quelques minutes

      MVC, Modèle Vue Contrôleur est un pattern qui vise à diviser une application en trois modules.

      • La vue : C'est l'interface graphique. Elle peut être une page Web, une fenêtre... Elle ne va contenir que du code lié à l'affichage. Elle ne devra en aucun cas contenir du code "d'action" ou du code métier. Elle appellera des fonctions précises de son contrôleur comme lors du clic sur un bouton. Il contiendra les classes du genre MenuPrincipal, BoutonGestion, BarreProgression.
      • Le modèle : C'est l'interface permettant d'accéder aux données ou de manipuler des données. Cela peut être une base de données, un fichier, une connexion FTP, une console SSH etc... On élargit le rôle du modèle à celui qui va effectuer les actions principales de l'application. Dans le cas d'un jeu vidéo, cela pourra représenter les classes comme Joueur, Méchant, ou Voiture.
      • Le contrôleur : Plus difficile à cerner, il fait office de chef d'orchestre et va lier la vue au modèle. Il contiendra l'instance de la vue et les classes métier de base. Il contiendra des méthodes comme "clicBouton()" ou "fermerJeu()". Lors d'une mise à jour des données, il va dire à la vue : tiens la balle tirée par le joueur X soit se trouver aux coordonnées x,y,z. Et vice versa, il dira au modèle que le joueur est entré dans une maison et qu'il a fermé la porte derrière lui.

      J'espère que ça t'aura aidé :)

      Concernant ton problème

      Je ne vois pas où tu appelles ta fonction initBouton ni où tu crée ta classe. Il me faut plus de code ^^.

      -
      Edité par EclipseOnFire 27 mai 2016 à 0:20:22

      • Partager sur Facebook
      • Partager sur Twitter
      Error 2006, MySQL server has gone away
        27 mai 2016 à 1:31:06

        En tout cas merci de ta réponse :)

        Désoler pour le nommage je fais le nécessaire :)

        Donc pour le code j'ai fais une classe objet qui vas créer un gridPane et les boutons dedans.

        package vue;
        
        import javafx.scene.control.Button;
        import javafx.scene.layout.ColumnConstraints;
        import javafx.scene.layout.GridPane;
        import javafx.scene.layout.RowConstraints;
        import modele.Point;
        
        public class Plateau {
        	final int hauteur = 9;
        	final int largeur = 9;
        
        	public GridPane grid;
        
        	public Plateau() {
        		// TODO Auto-generated constructor stub
        		Button b;
        		grid = new GridPane(); // création du grid pane
        		for (int i = 0; i < hauteur; i++) {
        
        			RowConstraints ligne = new RowConstraints(); // création d'une ligne
        			ligne.setPercentHeight(100.0 / largeur);
        			grid.getRowConstraints().add(ligne); // placement des ligne dans le
        													// grid
        
        		}
        		for (int i = 0; i < largeur; i++) {
        
        			ColumnConstraints collonne = new ColumnConstraints();
        			collonne.setPercentWidth(100.0 / hauteur);
        			grid.getColumnConstraints().add(collonne);
        
        		}
        
        		for (int i = 0; i < largeur; i++) {
        			for (int j = 0; j < hauteur; j++) {
        
        				grid.add(b = new Button(), i, j); // placement des bouton
        				b.setPrefSize(100000, 10000); // grande taille vu que les bouton
        												// son dans le grid
        
        			}
        		}
        
        	}
        
        	public void marquerCase(Point p) {
        		
        		
        		
        		
        
        	}
        
        	public void decouvrirCase(Point p) {
        
        	}
        
        }

        Donc dans mon main je fais 

        package modele;
        
        import java.io.IOException;
        import Vue.Plateau;
        import javafx.application.Application;
        import javafx.fxml.FXMLLoader;
        import javafx.scene.Scene;
        import javafx.scene.layout.AnchorPane;
        import javafx.scene.layout.BorderPane;
        import javafx.scene.layout.StackPane;
        import javafx.stage.Stage;
        
        public class MainDemineur extends Application {
        	private Stage secStage;
        	private Stage primaryStage;
        	private BorderPane rootLayout;
        	private Plateau g;
        
        	@Override
        	public void start(Stage primaryStage) {
        		this.primaryStage = primaryStage;
        		this.primaryStage.setTitle("Demineur");
        		
        		
        		initRootLayout();
        		plateau();
        		
        	}
        
        	public void initRootLayout() {
        		try {
        			
        			// Load root layout from fxml file.
        			FXMLLoader loader = new FXMLLoader();
        			loader.setLocation(MainDemineur.class.getResource("/Vue/RootLayout.fxml"));
        			rootLayout = (BorderPane) loader.load();
        			
        
        			// Show the scene containing the root layout.
        			Scene scene = new Scene(rootLayout);
        
        			primaryStage.setScene(scene);
        			primaryStage.show();
        		} catch (IOException e) {
        			e.printStackTrace();
        		}
        	}
        
        	public void plateau() {
        		try {
        			Plateau g = new Plateau(); // Je fais mon objet mais j'arrive pas le charger.
        			FXMLLoader loader = new FXMLLoader();
        			loader.setLocation(MainDemineur.class.getResource("/Vue/Plateau.fxml"));
        			AnchorPane plateau = (AnchorPane) loader.load();
        
        			// Set person overview into the center of root layout.
        			rootLayout.setCenter(plateau);
        			
        
        		} catch (IOException e) {
        			e.printStackTrace();
        		}
        	}
        
        	public Stage getPrimaryStage() {
        
        		return primaryStage;
        	}
        
        	public static void main(String[] args) {
        		launch(args);
        	}
        }

        je fais des testes dans tout les sens mais j'arrive pas a charger cette grille :D 


        -
        Edité par Don_raftapss 27 mai 2016 à 2:13:27

        • Partager sur Facebook
        • Partager sur Twitter
          27 mai 2016 à 13:13:57

          Le souci c'est que JavaFX est casse-pieds lorsqu'il s'agit de combiner FXML et code. Il va falloir faire une recherche par ID.

          Essaie déjà de faire hériter ta classe Plateau de GridPane. Ce sera plus propre et ça nous facilitera la tâche : après tu peux supprimer ton champ grid et le remplacer partout par this.

          Ensuite l'objectif sera de trouver le composant sur lequel tu souhaites ajouter tes boutons. Dans ton fichier Plateau.fxml il faudra localiser l'élément parent et lui affecter un id.

          Enfin il te restera à faire ça :

          Node n = (Node)plateau.getScene().lookup("#identifiant");
          
          n.getChildren().add(new Plateau());//On ajoute tes boutons



          -
          Edité par EclipseOnFire 27 mai 2016 à 13:14:52

          • Partager sur Facebook
          • Partager sur Twitter
          Error 2006, MySQL server has gone away
            27 mai 2016 à 23:40:27

            Salut à toi,
            Merci des tes réponse :)

            Me semblais bien que c'est pas si facile que ça :D j'ai pas penser à l'heritage (certainement car je suis novice) par contre le this ça marche pas trop.

            ou je créer mon objet aussi bien qu'un enfant de primaire qui dessine sans dépasser :D

            this = new GridPane(); 

            J'ai essayer d'utiliser le constructeur super mais sans succes 

            • Partager sur Facebook
            • Partager sur Twitter
              26 juillet 2016 à 20:30:09

              Je déterre un peu désolé...

              Je ne comprends pas pourquoi tu fais ça ? Tu veux simplement instancier ton objet ?

              • Partager sur Facebook
              • Partager sur Twitter
              Error 2006, MySQL server has gone away

              Java fx8.

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown