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 :

Comment forcer le curseur à être devant un suffixe ?


Sujet :

JavaFX

  1. #1
    Membre averti
    Avatar de Heavy Metal Hero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : juin 2007
    Messages : 151
    Points : 326
    Points
    326
    Billets dans le blog
    13
    Par défaut Comment forcer le curseur à être devant un suffixe ?
    Bonjour,

    En JavaFx, j'applique un TextFormatter sur un TextField pour forcer le curseur à être avant un suffixe (je cherche à créer un champ "degré", donc le suffixe est °).

    Quand je lance mon application et que je clique sur le TextField, J'ai ce qui suit:
    Nom : après.jpg
Affichages : 51
Taille : 2,8 Ko

    Je voudrais le curseur avant °, comme ça:
    Nom : avant.jpg
Affichages : 47
Taille : 2,7 Ko

    Voici mon code:
    HelloApplication.java:
    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
    package com.example.demo;
     
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
     
    import java.io.IOException;
     
    public class HelloApplication extends Application {
        @Override
        public void start(Stage stage) throws IOException {
            FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
            Scene scene = new Scene(fxmlLoader.load(), 320, 240);
            stage.setTitle("Hello!");
            stage.setScene(scene);
            stage.show();
        }
     
        public static void main(String[] args) {
            launch();
        }
    }
    HelloController.java:
    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
    package com.example.demo;
     
    import javafx.fxml.FXML;
    import javafx.scene.control.TextField;
    import javafx.scene.control.TextFormatter;
     
    public class HelloController {
        @FXML
        private TextField input;
     
        @FXML
        private void initialize() {
            input.setText("°");
            input.setTextFormatter(getSuffix("°"));
        }
     
        public TextFormatter<String> getSuffix(String suffix) {
            return new TextFormatter<>(pChange -> {
                int maxPos = pChange.getControlText().length() - suffix.length();
                if (pChange.isContentChange()) {
                    pChange.setRange(Math.min(pChange.getRangeStart(), maxPos), Math.min(pChange.getRangeEnd(), maxPos));
                } else {
                    pChange.setCaretPosition(Math.min(pChange.getCaretPosition(), maxPos));
                    pChange.setAnchor(Math.min(pChange.getAnchor(), maxPos));
                }
                return pChange;
            });
        }
    }
    hello-view.fxml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.geometry.Insets?>
    <?import javafx.scene.control.TextField?>
    <?import javafx.scene.layout.VBox?>
     
    <VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/null" fx:controller="com.example.demo.HelloController">
        <padding>
            <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
        </padding>
       <children>
          <TextField fx:id="input" />
       </children>
    </VBox>
    Avez-vous une solution ?

    Merci

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : août 2005
    Messages : 6 722
    Points : 22 591
    Points
    22 591
    Billets dans le blog
    50
    Par défaut
    Alors c'est pas exactement ce que tu veux faire mais je suis parti sur cette solution. Pas teste a fond, vérifier les bugs.

    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
    package test.forcecaret;
     
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.TextField;
    import javafx.scene.control.TextFormatter;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    import javafx.util.StringConverter;
     
    import java.util.Optional;
     
    public final class Main extends Application {
        @Override
        public void start(final Stage stage) throws Exception {
            final var suffix = "°";
            final var pattern = "^[-\\+]?\\d*.?\\d*°$";
            final var temperatureConverter = new StringConverter<Double>() {
                @Override
                public String toString(final Double value) {
                    System.out.println("toString(%f)".formatted(value));
                    var result = Optional.ofNullable(value)
                            .map(v -> Double.toString(v))
                            .orElse("0");
                    result += suffix;
                    System.out.println("-> \"%s\"".formatted(result));
                    return result;
                }
     
                @Override
                public Double fromString(String text) {
                    System.out.println("fromString(\"%s\")".formatted(text));
                    var value = text.strip();
                    final int suffixIndex = text.lastIndexOf(suffix);
                    if (suffixIndex >= 0) {
                        value = text.substring(0, suffixIndex);
                    }
                    final double result = Double.parseDouble(value);
                    System.out.println("-> %f".formatted(result));
                    return result;
                }
            };
            final var temperatureFormatter = new TextFormatter<Double>(temperatureConverter);
            final var textField = new TextField();
            textField.setMaxWidth(500);
            textField.setText(suffix);
            textField.setTextFormatter(temperatureFormatter);
            temperatureFormatter.valueProperty().addListener((observable, oldValue, newValue) -> {
                System.out.println("Value changed from \"%f\" to \"%f\"".formatted(oldValue, newValue));
                final var text = textField.getText();
                final int suffixIndex = text.lastIndexOf(suffix);
                if (suffixIndex >= 0) {
                    textField.positionCaret(text.lastIndexOf(suffix));
                }
            });
            final var root = new StackPane();
            root.getChildren().setAll(textField);
            final var scene = new Scene(root);
            stage.setWidth(800);
            stage.setHeight(600);
            stage.setScene(scene);
            stage.show();
            stage.setTitle("Test");
        }
    }
    PS : appuyer sur entrer ou changer le focus pour valider la saisie.
    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. Comment forcer le curseur sur Zone de Texte.
    Par CLASSIQUE dans le forum IHM
    Réponses: 3
    Dernier message: 27/06/2013, 18h10
  2. Réponses: 4
    Dernier message: 11/08/2010, 16h01
  3. Réponses: 6
    Dernier message: 15/11/2007, 12h31
  4. Comment mettre le curseur d'un Memo sur le Canvas d'une Form ?
    Par julie20 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/08/2003, 13h24
  5. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54

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