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 :

Modification de DatePicker avec des boutons flèches


Sujet :

JavaFX

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Modification de DatePicker avec des boutons flèches
    bonjour
    J'ai un DatePicker que je veux transformer :
    Nom : DatePickerCurrent.png
Affichages : 538
Taille : 1,2 Ko

    Je l'ai modifié avec css et j'obtiens ceci :
    Nom : DatePickerEnCours.png
Affichages : 550
Taille : 1,8 Ko

    Je souhaite le modifier pour qu'il ressemble à ceci :
    Nom : DatepickerResult.png
Affichages : 546
Taille : 8,0 Ko

    Mon problème est de mettre les deux boutons de chaque côté sans créer un nouveau composant fxml.
    J'ai trouvé que la classe DatePickerSkin peut être utilisée pour modifier le DatePicker mais je ne sais pas comment.

    Merci Pour votre aide.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Alors quand je lis le code de DatePickerSkin, il apparait que le problème est un peu plus complexe que pour le menu popup. Cette classe hérite de ComboBoxPopupControl qui hérite elle-même de ComboBoxBaseSkin. Et c'est dans la méthode layoutChildren(final double x, final double y, final double w, final double h) de cette classe qu'a lieu la mise en page. Le code apparemment se contente juste de positionner l’éditeur et le bouton qui fait surgir le menu popup.

    Pour pour faire ce que tu veux faire, il faudra:
    1. Hériter de DatePickerSkin avec le soucis bien sur que cette classe n'est pas actuellement publique.
    2. Dans ton constructeur, ajouter deux boutons (les flèches de par et d'autre de l’éditeur) et les listeners qui vont bien pour les faire fonctionner (oublie le behavior, il n'est pas publique et ne le sera pas dans le JDK 9).
    3. Surcharger le layoutChildren(x, y, h, w) pour faire une mise en page correcte. Au choix :
      • Faire tous les calculs de taille de de positionnement a mano.
      • Introduire une HBox dans le constructeur et recopier tout dedans pour faire une mise en page automatique.


    Le seul soucis mon bon monsieur, c'est que arrowButton est protected mais displayNode est private. Du coup il va falloir invoquer getDisplayNode() a la place (pas bien dur).
    Bon ça, c'est la méthode si tu veux reskinner un DatePicker.

    Sinon la méthode la plus simple c'est tout simplement de créer un nouveau contrôle qui utilise une HBox, un DatePicker et deux boutons et de le rendre utilisable par SceneBuilder / ton FXML et basta.
    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 à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse.
    Je vais regarder tout ça.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Sinon la méthode la plus simple c'est tout simplement de créer un nouveau contrôle qui utilise une HBox, un DatePicker et deux boutons et de le rendre utilisable par SceneBuilder / ton FXML et basta
    Je suis nouveau dans javafx et je ne vois pas comment je dois faire.
    il doit y avoir ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HBox hboxDatePicker = new HBox();
    Button leftArrowButton = new Button();
    Button rightArrowButton = new Button();
    DatePicker datePicker;
    Mais je ne sais pas quoi en faire.
    Tu peux m'indiquer le code.
    Merci.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Non en fait le datepickerskin est la solution mais je suis bloqué.
    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
    public class EPSDatePickerSkin extends DatePickerSkin{
    	Button leftArrowButton = new Button();
    	Button rightArrowButton = new Button();
     
    	public EPSDatePickerSkin(DatePicker dp){
    		super(dp);
     
    		Image imageLeft = new Image("/icons/compo/generic/arrowbutton/arrow_left.png");
    		ImageView iconLeft = new ImageView(imageLeft);
    		leftArrowButton.setGraphic(iconLeft);
     
    		Image imageRight = new Image("/icons/compo/generic/arrowbutton/arrow_right.png");
    		ImageView iconRight = new ImageView(imageRight);
    		rightArrowButton.setGraphic(iconRight);
     
     
     
    		getChildren().addAll(leftArrowButton, dp, rightArrowButton);
    	}
    }
    Je cherche à remplacé ce qu'il y a dans un DatePickerSkin, c'est à dire le textfield et le bouton, pour mettre à la place un bouton, un datepicker et un bouton.
    Je ne sais pas comment faire.

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Un petit exemple :

    Nom : datepickerskin.jpg
Affichages : 650
Taille : 100,7 Ko

    Code CSS : 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
    .root {
        -fx-spacing: 6px;
        -fx-padding: 6px;
    }
    .eps-date-picker {
        -fx-skin: "datepickerskin.EPSDatePickerSkin";
    }
    .eps-date-picker .left-arrow-button .arrow {    
        -fx-padding: 3px 4px 3px 4px;
        -fx-shape: "m 4.9949292,1045.3622 -3,3 3,3";
        -fx-scale-shape: true;
        -fx-border-color: derive(black, 33%);
        -fx-border-width: 1.5px;
    }
    .eps-date-picker .right-arrow-button .arrow {
        -fx-padding: 3px 4px 3px 4px;
        -fx-shape: "m 2,1045.3622 3,3 -3,3";
        -fx-scale-shape: true;
        -fx-border-color: derive(black, 33%);
        -fx-border-width: 1.5px;
    }

    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
    package datepickerskin;
     
    import com.sun.javafx.scene.control.skin.DatePickerSkin;
    import javafx.scene.control.Button;
    import javafx.scene.control.DatePicker;
    import javafx.scene.layout.Region;
     
    public class EPSDatePickerSkin extends DatePickerSkin {
     
        final Button leftArrowButton = new Button();
        final Button rightArrowButton = new Button();
     
        public EPSDatePickerSkin(DatePicker dp) {
            super(dp);
            //
            final Region leftArrow = new Region();
            leftArrow.setId("arrow");
            leftArrow.getStyleClass().add("arrow");
            leftArrowButton.setId("left-arrow-button");
            leftArrowButton.getStyleClass().add("left-arrow-button");
            leftArrowButton.setGraphic(leftArrow);
            //
            final Region rightArrow = new Region();
            rightArrow.setId("arrow");
            rightArrow.getStyleClass().add("arrow");
            rightArrowButton.setId("right-arrow-button");
            rightArrowButton.getStyleClass().add("right-arrow-button");
            rightArrowButton.setGraphic(rightArrow);
            getChildren().add(0, leftArrowButton);
            getChildren().add(rightArrowButton);
        }
     
        @Override
        protected void layoutChildren(double x, double y, double w, double h) {
            final double prefLW = snapSize(leftArrowButton.prefWidth(-1));
            final double prefRW = snapSize(rightArrowButton.prefWidth(-1));
            leftArrowButton.resizeRelocate(x, y, prefLW, h);
            rightArrowButton.resizeRelocate(x + w - prefRW, y, prefRW, h);
            final double pickerX = x + prefLW;
            final double pickerY = y;
            final double pickerW = Math.max(0, w - (prefLW + prefRW));
            final double pickerH = h;
            super.layoutChildren(pickerX, pickerY, pickerW, pickerH);
        }
    }
    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
    package datepickerskin;
     
    import java.net.URL;
    import java.util.Optional;
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.DatePicker;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    import org.scenicview.ScenicView;
     
    public class Main extends Application {
     
        @Override
        public void start(Stage primaryStage) {
            final DatePicker datePicker1 = new DatePicker();
            final DatePicker datePicker2 = new DatePicker();
            datePicker2.getStyleClass().add("eps-date-picker");
            final VBox root = new VBox();
            root.getChildren().setAll(datePicker1, datePicker2);
            final Scene scene = new Scene(root, 500, 500);        
            final Optional<URL> cssURL = Optional.ofNullable(getClass().getResource("test.css"));
            cssURL.ifPresent(url -> scene.getStylesheets().add(url.toExternalForm()));
            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();
            ScenicView.show(scene);
        }
     
        public static void main(String[] args) {
            launch(args);
        }   
    }
    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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci mon sauveur
    Ca marche parfaitement.
    C'est quand même dommage qu'il n'y ait pas de doc là dessus.

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Oui mais pour le moment elles sont privées les skins, elles ne seront publiques que dans le JDK9 (mais je ne m'attends guère à plus de doc). Et puis ainsi l'apparence pêche un peu avec la bordure du picker qui englobe aussi les boutons de part et d'autre.
    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

Discussions similaires

  1. [MySQL] tableau en php avec des boutons de modification et suppression
    Par mouloudis dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/05/2013, 16h18
  2. problème de avec des boutons
    Par babap1 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 04/01/2007, 09h13
  3. [C#] Message box avec des boutons diff.
    Par BoOom dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/04/2006, 11h47
  4. Afficher un fond en arrière plan avec des boutons
    Par eGen dans le forum Agents de placement/Fenêtres
    Réponses: 15
    Dernier message: 03/04/2005, 23h37

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