IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Alignement des composants et bordure


Sujet :

JavaFX

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Par défaut Alignement des composants et bordure
    Bonjour,

    Je débute en JavaFX et je rencontre quelques problèmes et notamment dans l'alignement des composants.
    J'ai créé un classe principale appelée MainView et des 'sous' classes qui sont des composants que j'intègre dans la classe principale.
    Voici un bout de code d'une 'sous' classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class TestPanel extends Parent {
     
        // Constructeur
        public TestPanel() { 
     
            GridPane gridPane = new GridPane();
     
            gridPane.setPadding(new Insets(20, 0, 20, 20)); 
            gridPane.setHgap(7); gridPane.setVgap(7); 
    	...
    et de la classe principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    public class MainView extends Application {
     
        @Override
        public void start(Stage primaryStage) {
            primaryStage.setTitle("Gravimetry");
    	BorderPane borderPane = new BorderPane();
     
    	// Groups **********************************************
            TestPanel testPanel = new TestPanel();
     
    	// TabPane*******************************************************************
            TabPane tabPane = new TabPane();
            Tab tabDataAcquisition = new Tab(Messages.getString("tabDataAcquisition"));
            tabDataAcquisition.setContent(testPanel);
            tabPane.getTabs().add(tabDataAcquisition);
            ...
     
    	borderPane.setCenter(vehiclePanel);
     
            this.getChildren().add(tabPane);
    	Scene scene = new Scene(root, 1060, 670, Color.LIGHTBLUE);
     
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    }
    Le problème c'est que je n'arrive pas à centrer (et qu'il prenne toute la place dans le Tab) le composant testPanel dans le Tab.
    J'ai essayé avec setAlignment(Pos.CENTER); mais ça ne fonctionne pas. J'ai eu le même problème en voulant donner une dimension à ce composant pour qu'il prenne toute la place disponible dans le Tab mais rien ne fonctionne !

    Quelqu'un à une solution ?

    NB: Concernant les bordures, je souhaite appliquer une bordure 'ShadowedBorder' mais je ne trouve pas

    Merci.

    Marc

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    L'ennui c'est qu'en l'état le code source que tu as posté ne permet pas de tester ou de voir ce qui ne va pas (il manque trop de truc pour pouvoir compiler). T'es-t-il possible de poster un exemple simple qui fonctionne ou de joindre une capture de ce qui ne va pas ou un prototype de ce que tu voudrais obtenir ?

    Pour un effet d'ombre portée il faut utiliser l'effet graphique DropShadow.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Par défaut
    Merci,
    pour le border et l'alignement de mes composants, voici ce que je voudrais +/- obtenir : http://igm.univ-mlv.fr/~dr/XPOSE2005...abs/swingX.php (en bas de la fenêtre sous le titre JXTitledPanel)
    et voici ttes les classes nécessaires (j'espère que ça ira car j'ai modifié un peu les classes pour ne pas envoyer tout le code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    package gui;
     
    import gui.groupDataAcquisition.GroupDataAcquisition;
    import java.util.ResourceBundle;
    import javafx.application.Application;
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Label;
    import javafx.scene.control.Menu;
    import javafx.scene.control.MenuBar;
    import javafx.scene.control.MenuItem;
    import javafx.scene.control.Tab;
    import javafx.scene.control.TabPane;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.scene.paint.Color;
    import javafx.stage.Stage;
    import utils.LanguageDispatcher;
    import utils.Messages;
     
     
    public class MainView extends Application {
     
        @Override
        public void start(Stage primaryStage) {
            primaryStage.setTitle("Gravimetry");
            VBox root = new VBox();
            HBox hbox = new HBox(7);    // 7 = espace horizontal entre les éléments
            //on créé un objet groupDataAcquisition
            GroupDataAcquisition groupDataAcquisition = new GroupDataAcquisition();
     
            // Menu**********************************************************************
            MenuBar menuBar = new MenuBar();
            Menu calibrationMenu = new Menu(Messages.getString("calibrationMenu"));
            MenuItem encodeDataItem = new MenuItem(Messages.getString("encodeDataItem"));
            calibrationMenu.getItems().setAll(encodeDataItem);
            Menu gravimetryMenu = new Menu(Messages.getString("gravimetryMenu"));
            MenuItem testLabItem = new MenuItem(Messages.getString("testLabItem"));
            MenuItem loadingTestPlaneItem = new MenuItem(Messages.getString("loadingTestPlaneItem"));
            gravimetryMenu.getItems().setAll(testLabItem, loadingTestPlaneItem);
            Menu reportMenu = new Menu(Messages.getString("reportMenu"));
            MenuItem generateItem = new MenuItem(Messages.getString("generateItem"));
            MenuItem exportItem = new MenuItem(Messages.getString("exportItem"));
            reportMenu.getItems().setAll(generateItem, exportItem);
            menuBar.getMenus().addAll(calibrationMenu, gravimetryMenu, reportMenu);
     
            // SerialPortConnection (label)****************************************        
            Label lbSerialPortConnection = new Label(Messages.getString("lbSerialPortConnection")); 
            hbox.setAlignment(Pos.TOP_RIGHT);
            hbox.setPadding(new Insets(4, 8, 4, 0));
            hbox.getChildren().add(lbSerialPortConnection);
     
     
            // TabPane*******************************************************************
            TabPane tabPane = new TabPane();
            Tab tabDataAcquisition = new Tab(Messages.getString("tabDataAcquisition"));
            Tab tabRealTemp = new Tab(Messages.getString("tabRealTemp"));
            tabDataAcquisition.setContent(groupDataAcquisition);
            tabPane.getTabs().add(tabDataAcquisition);
            tabPane.getTabs().add(tabRealTemp);
     
            root.getChildren().add(menuBar);
            root.getChildren().add(hbox);
            root.getChildren().add(tabPane);
     
            Scene scene = new Scene(root, 1060, 670, Color.LIGHTBLUE);
     
            primaryStage.setScene(scene);
            primaryStage.show();
     
        }
     
     
     
        public static void main(String[] args) {
            LanguageDispatcher.getInstance().setResourceBundle(ResourceBundle.getBundle("utils/MessageBundle_fr_BE")); 
     
            new Messages();
            launch(args);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    package gui.groupDataAcquisition;
     
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Parent;
    import javafx.scene.layout.Border;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.BorderStroke;
    import javafx.scene.layout.BorderStrokeStyle;
    import javafx.scene.layout.BorderWidths;
    import javafx.scene.layout.CornerRadii;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.StackPane;
    import javafx.scene.paint.Color;
     
    public class GroupDataAcquisition extends Parent{
     
        public GroupDataAcquisition(){
     
            // Layout **********************************************
            StackPane root = new StackPane();
            BorderPane borderPane = new BorderPane();
            root.getChildren().add(borderPane);
            root.setAlignment(Pos.CENTER);
     
            // Groups **********************************************
            TestPanel testPanel = new TestPanel();
            VehiclePanel vehiclePanel = new VehiclePanel();
            BalancePanel balancePanel = new BalancePanel();
     
            borderPane.setTop(testPanel);
            borderPane.setLeft(vehiclePanel);
            borderPane.setRight(balancePanel);
     
            this.getChildren().add(root);
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    package gui.groupDataAcquisition;
     
    import javafx.scene.Parent;
    import javafx.scene.control.TextField;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.GridPane;
     
    public class BalancePanel extends Parent{
     
        public BalancePanel(){
            GridPane gridPane = new GridPane();
            gridPane.setHgap(7); gridPane.setVgap(7);
     
            TextField tfLeftBalance_1 = new TextField();
            tfLeftBalance_1.setPrefSize(40, 30);
            TextField tfRightBalance_2 = new TextField();
            tfRightBalance_2.setPrefSize(40, 30);
            TextField tfLeftBalance_3 = new TextField();
            tfLeftBalance_3.setPrefSize(40, 30);
            TextField tfRightBalance_4 = new TextField();
            tfRightBalance_4.setPrefSize(40, 30);
     
            gridPane.add(tfLeftBalance_1, 0, 0); gridPane.add(tfRightBalance_2, 1, 0); 
            gridPane.add(tfLeftBalance_3, 0, 1); gridPane.add(tfRightBalance_4, 1, 1);
     
            this.getChildren().add(gridPane);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    package gui.groupDataAcquisition;
     
    import javafx.geometry.HPos;
    import javafx.geometry.Insets;
    import javafx.scene.Parent;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.DatePicker;
     
    import javafx.scene.control.Label;
    import javafx.scene.control.TextArea;
    import javafx.scene.control.TextField;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.GridPane;
    import javafx.scene.layout.Region;
    import utils.Messages;
     
    public class TestPanel extends Parent {
     
        // Constructeur
        public TestPanel() { 
     
            GridPane gridPane = new GridPane();
     
            //permet de régler l'espace ...
            gridPane.setPadding(new Insets(20, 0, 20, 20)); 
     
            gridPane.setHgap(7); gridPane.setVgap(7); 
     
            Label lbTest = new Label(Messages.getString("lbTest")); 
            GridPane.setHalignment(lbTest, HPos.RIGHT);
            ComboBox<String> cbbTest= new ComboBox<String>();
            cbbTest.setEditable(true);
            cbbTest.setVisibleRowCount(5); // Max 5 éléments visibles
     
            Label lbDate = new Label(Messages.getString("lbDate")); 
            GridPane.setHalignment(lbDate, HPos.RIGHT); 
            DatePicker datePicker= new DatePicker();
     
            Label lbWriter = new Label(Messages.getString("lbWriter")); 
            GridPane.setHalignment(lbWriter, HPos.RIGHT); 
            ComboBox<String> cbbWriter= new ComboBox<String>();
            cbbWriter.setEditable(true);
            cbbWriter.setVisibleRowCount(5); // Max 5 éléments visibles
     
            // utilisé afin de créer une colonne vide dans le GridPane 
            Region region = new Region();
            region.setPrefSize(170, 0); 
     
            Label lbNumberOfAxles = new Label(Messages.getString("lbNumberOfAxles"));
            GridPane.setHalignment(lbNumberOfAxles, HPos.RIGHT);
            TextField tf_1 = new TextField();
     
    	Label lbAcquisitionInterval = new Label(Messages.getString("lbAcquisitionInterval")); 
            GridPane.setHalignment(lbAcquisitionInterval, HPos.RIGHT); 
            TextField tf_2 = new TextField();
     
            Label lbNote = new Label(Messages.getString("lbNote")); 
            GridPane.setHalignment(lbNote, HPos.RIGHT); 
            TextArea taNote = new TextArea(); 
            taNote.setWrapText(true);    // définit si le texte passe à la ligne suivante lorsqu'il atteint la limite de la zone (création scrollBar)
            taNote.setPrefColumnCount(25);  // utilisé pour le calcul de la largeur préférée de la zone de texte
            taNote.setPrefRowCount(2);  // utilisé pour le calcul de la hauteur préférée de la zone de texte
            GridPane.setColumnSpan(taNote, 3); 
            GridPane.setRowSpan(taNote, 2);     
     
            gridPane.add(lbTest, 0, 0); gridPane.add(cbbTest, 1, 0); gridPane.add(region, 2, 0); gridPane.add(lbNumberOfAxles, 3, 0);  gridPane.add(tf_1, 4, 0);
            gridPane.add(lbDate, 0, 1); gridPane.add(datePicker, 1, 1); gridPane.add(lbAcquisitionInterval, 3, 1);  gridPane.add(tf_2, 4, 1);
            gridPane.add(lbWriter, 0, 2); gridPane.add(cbbWriter, 1, 2); gridPane.add(lbNote, 3, 2); gridPane.add(taNote, 4, 2);
     
            //on ajoute le gridPane au groupe
            this.getChildren().add(gridPane);
     
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    package gui.groupDataAcquisition;
     
    import javafx.geometry.HPos;
    import javafx.geometry.Insets;
    import javafx.scene.Parent;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextArea;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.Border;
    import javafx.scene.layout.BorderStroke;
    import javafx.scene.layout.BorderStrokeStyle;
    import javafx.scene.layout.BorderWidths;
    import javafx.scene.layout.CornerRadii;
    import javafx.scene.layout.GridPane;
    import javafx.scene.paint.Color;
    import utils.Messages;
     
    public class VehiclePanel extends Parent{
     
        // Constructeur
        public VehiclePanel() { 
     
            GridPane gridPane = new GridPane();
            gridPane.setGridLinesVisible(true);
            //permet de régler l'espace ...
            gridPane.setPadding(new Insets(20, 0, 20, 20)); 
            //
            gridPane.setHgap(7); gridPane.setVgap(7); 
     
            Label lbVehicle = new Label(Messages.getString("lbVehicle")); 
            GridPane.setHalignment(lbVehicle, HPos.RIGHT); 
            TextField tfVehicle = new TextField();
     
            Label lbType = new Label(Messages.getString("lbType")); 
            GridPane.setHalignment(lbType, HPos.RIGHT); 
            TextField tfType = new TextField();
     
            Label lbNimma = new Label(Messages.getString("lbNimma")); 
            GridPane.setHalignment(lbNimma, HPos.RIGHT); 
            TextField tfNimma = new TextField(); 
     
            Label lbMaxMass = new Label(Messages.getString("lbMaxMass")); 
            GridPane.setHalignment(lbMaxMass, HPos.RIGHT); 
            TextField tfMaxMass = new TextField();
            Label lbMassDriver = new Label(Messages.getString("lbMassDriver"));
            GridPane.setHalignment(lbMassDriver, HPos.RIGHT);
            TextField tfMassDriver = new TextField(); 
     
            Label lbConfiguration = new Label(Messages.getString("lbConfiguration")); 
            GridPane.setHalignment(lbConfiguration, HPos.RIGHT); 
            TextField tfConfiguration = new TextField();
     
            Label lbLoading = new Label(Messages.getString("lbLoading")); 
            GridPane.setHalignment(lbLoading, HPos.RIGHT); 
            TextArea taLoading = new TextArea();
            taLoading.setWrapText(true);    // définit si le texte passe à la ligne suivante lorsqu'il atteint la limite de la zone (création scrollBar)
            taLoading.setPrefColumnCount(25);
            taLoading.setPrefRowCount(2); 
            GridPane.setColumnSpan(taLoading, 3); 
            GridPane.setRowSpan(taLoading, 2);     
     
            gridPane.add(lbVehicle, 0, 0); gridPane.add(tfVehicle, 1, 0); 
            gridPane.add(lbType, 0, 1); gridPane.add(tfType, 1, 1);
            gridPane.add(lbNimma, 0, 2); gridPane.add(tfNimma, 1, 2);
            gridPane.add(lbMaxMass, 0, 3); gridPane.add(tfMaxMass, 1, 3);
            gridPane.add(lbMassDriver, 0, 4);  gridPane.add(tfMassDriver, 1, 4);
            gridPane.add(lbConfiguration, 0, 5);  gridPane.add(tfConfiguration, 1, 5);
            gridPane.add(lbLoading, 0, 6); gridPane.add(taLoading, 1, 6); 
     
            Border border= new Border(new BorderStroke(Color.GREEN,BorderStrokeStyle.DOTTED,CornerRadii.EMPTY,new BorderWidths(6),new Insets(0) ));
            gridPane.setBorder(border);
     
            //on ajoute le gridPane au groupe
            this.getChildren().add(gridPane);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    package utils;
     
    import java.util.ResourceBundle;
     
    public class Messages {
     
        private static ResourceBundle messages;
     
        public Messages(){
            messages = LanguageDispatcher.getInstance().getResourceBundle();
        }
     
        public static String getString(String key) {
            return messages.getString(key);
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    package utils;
     
    import java.util.Locale;
    import java.util.ResourceBundle;
     
    public class LanguageDispatcher {
        private  ResourceBundle messages;
        private  String language;
        private  String country;
     
        // SINGLETON -------------------------------------------------------
     
        private static LanguageDispatcher instance;
        private LanguageDispatcher(){
     
        }
        public synchronized static LanguageDispatcher getInstance(){
            if (null == instance)  	instance = new LanguageDispatcher();
            return instance;
        }
        //-------------------------------------------------------------------
     
        public void toogleSetResourceBundle(String languageChoice){
     
    	if(languageChoice=="fr_BE"){
                language = new String("fr");
                country = new String ("BE");
    	}else if(languageChoice=="en_GB"){
                language = new String("en");
                country = new String ("GB");
    	}
     
    	Locale currentLocale = new Locale(language, country);
    	ResourceBundle messages = ResourceBundle.getBundle("utils/MessageBundle", currentLocale);
    	this.messages = messages;
    	}
     
    	public ResourceBundle getResourceBundle() {
    		return this.messages;
    	}
     
    	public void setResourceBundle(ResourceBundle messages) {
    		this.messages = messages;
    	}
     
    }
    et le code d'un fichier properties (MessageBundle_fr_BE.properties) :

    # MENU*******************************************
    calibrationMenu = Calibration
    encodeDataItem = Encoder donn\u00e9es
    exportItem = Exporter
    generateItem = G\u00e9n\u00e9rer
    gravimetryMenu = Gravim\u00e9trie
    loadingTestPlaneItem = Test plan chargement
    reportMenu = Rapport
    testLabItem = Test labo

    # TAB********************************************
    tabDataAcquisition = Acquisition des donn\u00e9es
    tabRealTemp = Temps r\u00e9el

    # GROUP TEST*************************************
    lbAcquisitionInterval = Intervalle d'acquisition [ms] :
    lbConfiguration = Configuration :
    lbLoading = Chargement :
    lbDate = Date :
    lbMassDriver = Masse chauffeur [kg] :
    lbMaxMass = Masse maximale [kg] :
    lbNimma = NIMMA :
    lbNote = Remarque :
    lbNumberOfAxles = Nombre d'essieux :
    lbPanelTest = V\u00e9hicule
    lbSerialPortConnection = Port s\u00e9rie :
    lbTest = Test :
    lbType = Type :
    lbVehicle = V\u00e9hicule :
    lbWriter = R\u00e9dacteur :

  4. #4
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    Bonjour,

    il y a comme une class qui manque pour faire fonctionner l'ensemble

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gui.utils.spinner.NumberSpinner;

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Par défaut
    Merci pour votre attention.

    J'ai modifié le code de la classe 'TestPanel' dans mon message car la classe NumberSpinner n'est pas nécessaire.

    Marc

  6. #6
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    ok la ton projet fonctionne vous voulez faire quoi plus exactement ?

    si j'ai bien compris vous voulez que le GridPane (encadré en vert)qui contient les infos du véhicule occupe tout l'espace disponible

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Par défaut
    J'aimerais avoir un résultat +/- comme ici : http://igm.univ-mlv.fr/~dr/XPOSE2005...abs/swingX.php (en bas de la fenêtre sous le titre JXTitledPanel).
    C'est à dire que le TestPanel soit au dessus mais centré horizontalement. Le VehiclePanel et le BalancePanel sur la même ligne en dessous du TestPanel.
    Et je mettrai un 4eme panel (pas encore repris dans le code) tout en dessous.

    Le problème c'est que je ne peux pas rien 'modifier'. Je souhaite changer l'alignement, mettre un ScrollPane, ... mais rien ne fonction.
    Tous mes composants restent alignés vers la gauche et ne prennent même pas tout l'espace de mon Tab !

  8. #8
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    vous voulez réaliser un truc comme ça

    Nom : JXTitledPanel.png
Affichages : 5132
Taille : 74,7 Ko

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Par défaut
    Oui mais ça c'est du Swing et en respectant la disposition dont j'ai parlé (on peut voir que mon 4eme composant en dessous n'est même pas complètement visible !) :

    Nom : printScreen.png
Affichages : 5166
Taille : 101,5 Ko

  10. #10
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    vous pouvez faire cela avec deux splitpane un horizontal qui va contenir un deuxième horizontale dans la partie de droite, demain je vais réadapter ton exemple

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Houla, je n'en demandais pas tant, on a pas non-plus besoin de connaitre tous vos secrets de fabrique.

    Le principal soucis que je vois c'est que tu utilises Parent partout pour construire ton UI. Donc, il est tout a fait normal que rien ne se repositionne ou ne s’agrandisse. Parent, c'est comme Pane (qui est sa version concrète) ou Group : c'est juste un conteneur d'autres nœuds. Donc il ne fait pas de réajustement ou de repositionnement a moins de surcharger [c]layoutChildren()[c/] et de faire les calculs et positionnements dedans qui s'imposent et par defaut il prend la taille de son contenu sans respecter les notifications de layout de son parent.

    Tu gagneras mieux a utiliser AnchorPane comme base de tes contrôles à la place, car tu peux mettre des ancres qui permettent donc un repositionnement/redimensionnement automatique du contenu.

    Par exemple, remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class GroupDataAcquisition extends Parent{
     
        public GroupDataAcquisition(){
     
            // Layout **********************************************
            StackPane root = new StackPane();
            BorderPane borderPane = new BorderPane();
            root.getChildren().add(borderPane);
            root.setAlignment(Pos.CENTER);
     
            // Groups **********************************************
            TestPanel testPanel = new TestPanel();
            VehiclePanel vehiclePanel = new VehiclePanel();
            BalancePanel balancePanel = new BalancePanel();
     
            borderPane.setTop(testPanel);
            borderPane.setLeft(vehiclePanel);
            borderPane.setRight(balancePanel);
     
            this.getChildren().add(root);
        }
     
    }
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    package layout.gui.groupDataAcquisition;
     
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.BorderPane;
     
    public class GroupDataAcquisition extends AnchorPane {
     
        public GroupDataAcquisition() {
     
            // Layout **********************************************
            BorderPane borderPane = new BorderPane();
            AnchorPane.setTopAnchor(borderPane, 0d);
            AnchorPane.setLeftAnchor(borderPane, 0d);
            AnchorPane.setBottomAnchor(borderPane, 0d);
            AnchorPane.setRightAnchor(borderPane, 0d);
     
            // Groups **********************************************
            TestPanel testPanel = new TestPanel();
            VehiclePanel vehiclePanel = new VehiclePanel();
            BalancePanel balancePanel = new BalancePanel();
            borderPane.setTop(testPanel);
            borderPane.setLeft(vehiclePanel);
            borderPane.setRight(balancePanel);
     
            this.getChildren().add(borderPane);
        }
    }
    Ici, désormais TestPanel prend toute la largeur de l'espace horizontal.

    Etc. pour la suite (même si c'est moins critique) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    package gui.groupDataAcquisition;
     
    import javafx.scene.control.TextField;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.GridPane;
     
    public class BalancePanel extends AnchorPane {
     
        public BalancePanel(){
            GridPane gridPane = new GridPane();
            AnchorPane.setTopAnchor(gridPane, 0d);
            AnchorPane.setLeftAnchor(gridPane, 0d);
            AnchorPane.setBottomAnchor(gridPane, 0d);
            AnchorPane.setRightAnchor(gridPane, 0d);
            gridPane.setHgap(7); gridPane.setVgap(7);
     
            TextField tfLeftBalance_1 = new TextField();
            tfLeftBalance_1.setPrefSize(40, 30);
            TextField tfRightBalance_2 = new TextField();
            tfRightBalance_2.setPrefSize(40, 30);
            TextField tfLeftBalance_3 = new TextField();
            tfLeftBalance_3.setPrefSize(40, 30);
            TextField tfRightBalance_4 = new TextField();
            tfRightBalance_4.setPrefSize(40, 30);
     
            gridPane.add(tfLeftBalance_1, 0, 0); gridPane.add(tfRightBalance_2, 1, 0); 
            gridPane.add(tfLeftBalance_3, 0, 1); gridPane.add(tfRightBalance_4, 1, 1);
     
            this.getChildren().add(gridPane);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    package gui.groupDataAcquisition;
     
    import javafx.geometry.HPos;
    import javafx.geometry.Insets;
    import javafx.scene.Parent;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.DatePicker;
     
    import javafx.scene.control.Label;
    import javafx.scene.control.TextArea;
    import javafx.scene.control.TextField;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.GridPane;
    import javafx.scene.layout.Region;
    import utils.Messages;
     
    public class TestPanel extends AnchorPane {
     
        // Constructeur
        public TestPanel() { 
            GridPane gridPane = new GridPane();
            AnchorPane.setTopAnchor(gridPane, 0d);
            AnchorPane.setLeftAnchor(gridPane, 0d);
            AnchorPane.setBottomAnchor(gridPane, 0d);
            AnchorPane.setRightAnchor(gridPane, 0d);
     
            //permet de régler l'espace ...
            gridPane.setPadding(new Insets(20, 0, 20, 20)); 
     
            gridPane.setHgap(7); gridPane.setVgap(7); 
     
            Label lbTest = new Label(Messages.getString("lbTest")); 
            GridPane.setHalignment(lbTest, HPos.RIGHT);
            ComboBox<String> cbbTest= new ComboBox<String>();
            cbbTest.setEditable(true);
            cbbTest.setVisibleRowCount(5); // Max 5 éléments visibles
     
            Label lbDate = new Label(Messages.getString("lbDate")); 
            GridPane.setHalignment(lbDate, HPos.RIGHT); 
            DatePicker datePicker= new DatePicker();
     
            Label lbWriter = new Label(Messages.getString("lbWriter")); 
            GridPane.setHalignment(lbWriter, HPos.RIGHT); 
            ComboBox<String> cbbWriter= new ComboBox<String>();
            cbbWriter.setEditable(true);
            cbbWriter.setVisibleRowCount(5); // Max 5 éléments visibles
     
            // utilisé afin de créer une colonne vide dans le GridPane 
            Region region = new Region();
            region.setPrefSize(170, 0); 
     
            Label lbNumberOfAxles = new Label(Messages.getString("lbNumberOfAxles"));
            GridPane.setHalignment(lbNumberOfAxles, HPos.RIGHT);
            TextField tf_1 = new TextField();
     
    	Label lbAcquisitionInterval = new Label(Messages.getString("lbAcquisitionInterval")); 
            GridPane.setHalignment(lbAcquisitionInterval, HPos.RIGHT); 
            TextField tf_2 = new TextField();
     
            Label lbNote = new Label(Messages.getString("lbNote")); 
            GridPane.setHalignment(lbNote, HPos.RIGHT); 
            TextArea taNote = new TextArea(); 
            taNote.setWrapText(true);    // définit si le texte passe à la ligne suivante lorsqu'il atteint la limite de la zone (création scrollBar)
            taNote.setPrefColumnCount(25);  // utilisé pour le calcul de la largeur préférée de la zone de texte
            taNote.setPrefRowCount(2);  // utilisé pour le calcul de la hauteur préférée de la zone de texte
            GridPane.setColumnSpan(taNote, 3); 
            GridPane.setRowSpan(taNote, 2);     
     
            gridPane.add(lbTest, 0, 0); gridPane.add(cbbTest, 1, 0); gridPane.add(region, 2, 0); gridPane.add(lbNumberOfAxles, 3, 0);  gridPane.add(tf_1, 4, 0);
            gridPane.add(lbDate, 0, 1); gridPane.add(datePicker, 1, 1); gridPane.add(lbAcquisitionInterval, 3, 1);  gridPane.add(tf_2, 4, 1);
            gridPane.add(lbWriter, 0, 2); gridPane.add(cbbWriter, 1, 2); gridPane.add(lbNote, 3, 2); gridPane.add(taNote, 4, 2);
     
            //on ajoute le gridPane au groupe
            this.getChildren().add(gridPane);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    package gui.groupDataAcquisition;
     
    import javafx.geometry.HPos;
    import javafx.geometry.Insets;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextArea;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.Border;
    import javafx.scene.layout.BorderStroke;
    import javafx.scene.layout.BorderStrokeStyle;
    import javafx.scene.layout.BorderWidths;
    import javafx.scene.layout.CornerRadii;
    import javafx.scene.layout.GridPane;
    import javafx.scene.paint.Color;
    import utils.Messages;
     
    public class VehiclePanel extends AnchorPane {
     
        // Constructeur
        public VehiclePanel() { 
     
            GridPane gridPane = new GridPane();
            AnchorPane.setTopAnchor(gridPane, 0d);
            AnchorPane.setLeftAnchor(gridPane, 0d);
            AnchorPane.setBottomAnchor(gridPane, 0d);
            AnchorPane.setRightAnchor(gridPane, 0d);
            gridPane.setGridLinesVisible(true);
            //permet de régler l'espace ...
            gridPane.setPadding(new Insets(20, 0, 20, 20)); 
            //
            gridPane.setHgap(7); gridPane.setVgap(7); 
     
            Label lbVehicle = new Label(Messages.getString("lbVehicle")); 
            GridPane.setHalignment(lbVehicle, HPos.RIGHT); 
            TextField tfVehicle = new TextField();
     
            Label lbType = new Label(Messages.getString("lbType")); 
            GridPane.setHalignment(lbType, HPos.RIGHT); 
            TextField tfType = new TextField();
     
            Label lbNimma = new Label(Messages.getString("lbNimma")); 
            GridPane.setHalignment(lbNimma, HPos.RIGHT); 
            TextField tfNimma = new TextField(); 
     
            Label lbMaxMass = new Label(Messages.getString("lbMaxMass")); 
            GridPane.setHalignment(lbMaxMass, HPos.RIGHT); 
            TextField tfMaxMass = new TextField();
            Label lbMassDriver = new Label(Messages.getString("lbMassDriver"));
            GridPane.setHalignment(lbMassDriver, HPos.RIGHT);
            TextField tfMassDriver = new TextField(); 
     
            Label lbConfiguration = new Label(Messages.getString("lbConfiguration")); 
            GridPane.setHalignment(lbConfiguration, HPos.RIGHT); 
            TextField tfConfiguration = new TextField();
     
            Label lbLoading = new Label(Messages.getString("lbLoading")); 
            GridPane.setHalignment(lbLoading, HPos.RIGHT); 
            TextArea taLoading = new TextArea();
            taLoading.setWrapText(true);    // définit si le texte passe à la ligne suivante lorsqu'il atteint la limite de la zone (création scrollBar)
            taLoading.setPrefColumnCount(25);
            taLoading.setPrefRowCount(2); 
            GridPane.setColumnSpan(taLoading, 3); 
            GridPane.setRowSpan(taLoading, 2);     
     
            gridPane.add(lbVehicle, 0, 0); gridPane.add(tfVehicle, 1, 0); 
            gridPane.add(lbType, 0, 1); gridPane.add(tfType, 1, 1);
            gridPane.add(lbNimma, 0, 2); gridPane.add(tfNimma, 1, 2);
            gridPane.add(lbMaxMass, 0, 3); gridPane.add(tfMaxMass, 1, 3);
            gridPane.add(lbMassDriver, 0, 4);  gridPane.add(tfMassDriver, 1, 4);
            gridPane.add(lbConfiguration, 0, 5);  gridPane.add(tfConfiguration, 1, 5);
            gridPane.add(lbLoading, 0, 6); gridPane.add(taLoading, 1, 6); 
     
            Border border= new Border(new BorderStroke(Color.GREEN,BorderStrokeStyle.DOTTED,CornerRadii.EMPTY,new BorderWidths(6),new Insets(0) ));
            gridPane.setBorder(border);
     
            //on ajoute le gridPane au groupe
            this.getChildren().add(gridPane);
        }
    }
    Je recommande toujours fortement l'utilisation de ScenicView pour explorer comment sont agences les composants entre eux (ce qui permet de voir quand un contrôle ne se redimensionne pas entre autres).

    Ensuite, la plus grande partie de cette interface pourrait etre tres facilement concue en FXML avec SceneBuilder, ce qui laisserait uniquement le code métier dans la classe contrôleur et rendrait les choses sans doute un peu plus lisibles. Essaie peut-etre de te pencher sur ce genre de conception d'UI (mais si ça ne te plait pas/convient pas, tu peux bien sur rester avec une UI codée main sans problème).

    EDIT - Pour la partie non entièrement visible, comme l'a dit aityahia, avec un SplitPane ou alors un ScrollPane.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Par défaut
    Merci, vous faites un travail formidable pour les débutants (et les autres )!
    J'utilise Parent car c'est ce que j'ai vu dans un tuto !
    En Swing, dans le même cas de figure, j'étendais de JPanel. Je suis aller voir un graph de la hiérarchie en JavaFX et je me pose la question : puis-je, par exemple, étendre de Region à la place de AnchorePane comme vous proposer (histoire de bien comprendre et non pas que votre solution ne me convient pas) ?

    Je modifierai mon code en fonction de vos remarques en soirée...

    Bàv.

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Oui, étendre Region est une bonne idée pour créer de nouveaux contrôles sans exposer trop la structure interne. Mais comme avec Parent, il faut alors surcharger layoutChildren() pour repositionner redimensionner le contenu (ici le GridPane) à chaque appel. Ce qui doit donner un truc à peu près comme ça (de mémoire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    protected void layoutChildren() {
        super.layoutChildren();
        final double width = getWidth();
        final double height = getHeight();
        final Insets insets = getInsets();
        layoutInArea(gridPane, insets.getLeft(), insets.getTop(), width - (insets.getLeft() + insets.getRight()), height - (insets.getTop() + insets.getBottom()), 0, HPos.LEFT, VPos.TOP);
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  14. #14
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    +1
    Citation Envoyé par bouye Voir le message
    Ensuite, la plus grande partie de cette interface pourrait etre tres facilement concue en FXML avec SceneBuilder, ce qui laisserait uniquement le code métier dans la classe contrôleur et rendrait les choses sans doute un peu plus lisibles. Essaie peut-etre de te pencher sur ce genre de conception d'UI (mais si ça ne te plait pas/convient pas, tu peux bien sur rester avec une UI codée main sans problème).
    EDIT - Pour la partie non entièrement visible, comme l'a dit aityahia, avec un SplitPane ou alors un ScrollPane.
    Comme proposé pas Bouye je te recommande vivement l'utilisation du langage FXML pour tes interfaces, avec SceneBuilder qui s’intègre très bien avec eclipse ou NetBeans (perso je préfère e(fx)eclipse).
    je te recommande ce tutorielqui est assez complet c'est en anglais.

  15. #15
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Par défaut
    Vos réponses mon bien aidé, j'ai pu avancer dans mon interface. Je clôture donc cette discussion.

    Merci, bàv.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Alignement des composants
    Par jimbolelephan dans le forum C#
    Réponses: 3
    Dernier message: 10/07/2008, 17h39
  2. Alignement des composants
    Par slimjoe dans le forum Delphi
    Réponses: 8
    Dernier message: 12/07/2007, 17h12
  3. alignement des composants
    Par naazih dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 22/03/2007, 17h18
  4. Réponses: 2
    Dernier message: 31/10/2006, 08h51
  5. [swing][debutant] alignement des composants
    Par melvar dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 10/03/2006, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo