Bonjour,
Est-il possible de bloquer le nombre de caractères que peut rentrer un utilisateur dans une textbox en javaFX? Et si oui comment?
Merci beaucoup d'avance pour vos réponse.
Bonjour,
Est-il possible de bloquer le nombre de caractères que peut rentrer un utilisateur dans une textbox en javaFX? Et si oui comment?
Merci beaucoup d'avance pour vos réponse.
Personne ne peut m'aider? J'essaie, j'essaie mais je n'y arrive pas![]()
Ca devrait t'aider un petit peu
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 public class StringBox extends TextBox { public var nbMaxChar: Number = 4; override var focusTraversable = false; function getStyle(color: String): String { "-fx-background-color: " "{color}, -fx-text-box-border, -fx-control-inner-background;"; } override var columns= 6; var str: String = bind rawText on replace { def nb = rawText.length(); set = nb <= nbMaxChar; } public var set: Boolean = true on replace { if (set) { style = getStyle("green") } else { style = getStyle("red"); } }; public var onChange: function (str: String); override var action = function(): Void { if(set) onChange(text); } } function run() { var val: String; Stage { title: "StringBox" scene: Scene { width: 350 height: 150 content: [ HBox { nodeVPos: VPos.CENTER spacing: 10 content: [ StringBox { onChange: function(pval: String): Void {val = pval} } Label { text: bind "{val}"} ] } ] } } }
Ok merci beaucoup de ta réponse même si ça correspond pas exactement à ce que je voulais faire.
Voilà comment je me suis pris pour bloquer le nombre de caractère à 4 dans ma textbox
Quand pensez-vous?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 textbox_annee = javafx.scene.control.TextBox { layoutX: 271.0 layoutY: 146.0 columns:45 text:"" onKeyPressed: function (e: KeyEvent): Void { def nb = textbox_annee.rawText.length(); if(nb >= 4) { textbox_annee.deletePreviousChar(); } } };
Ou sinon j'ai une autre question.
Est-ce que c'est possible lorsqu'on a tapé le nombre de caractères requis dans une textbox de passer automatiquement à une autre?
J'y travaillais... vu que c'est un besoin pour le moins courant !
Ma version consiste à créer une variante de la TextBox.
J'ai d'ailleurs anticipé ton second besoin : il est possible de restreindre à la saisie de nombres seulement (ou autre chose, cela peut être flexible).
Désolé pour les commentaires en anglais, c'est une habitude...
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 class RestrictiveTextBox extends TextBox { public-init var maxLen = 10; public-init var bDigitsOnly = true; init { columns = maxLen; } override function replaceSelection(replacingText: String): Void { // Find out what portion of text is replaced var pos1 = Math.min(dot, mark); var pos2 = Math.max(dot, mark); // We cannot change parameters... :-( var rt = replacingText; if (bDigitsOnly) { // Let regex do the job for us... Not efficient but that's answer to user input, performance isn't critical rt = rt.replaceAll("\\D+", ""); } // The expected result var newText = "{rawText.substring(0, pos1)}{rt}{rawText.substring(pos2)}"; // Are we exceeding the limit? if (newText.length() > maxLen) { // Yes, compute how much var diff = newText.length() - maxLen; // We are already at max if (diff >= rt.length()) return; // Just don't insert it // Truncate the input to fit in the box rt = rt.substring(0, diff); } // Insert the perhaps truncated string super.replaceSelection(rt); } } var input: RestrictiveTextBox; Stage { title: "Test Forum" scene: Scene { width: 200 height: 100 content: input = RestrictiveTextBox { maxLen: 8 font: Font { size: 36 } } } }
Remarques sur ton code :
- Il faudrait if (nb > 4), pas >= 4 (example : taper 4 chars, puis flèche gauche)
- Quoique... Le problème est que tu traites rawText qui n'est pas mis à jour au moment de l'évènement.
- Apparemment, le "coller" (paste) ne génère pas cet évènement...
C'est marrant on a à peu près tous les mêmes besoins....![]()
Voilà la réponse à ta deuxième question.
Je vais ajouter une validation, je pense (histoire d'éviter de taper 66 dans le jour ou le mois).
(Tiens, c'est mon cinquantième message, je suis enfin "Membre du Club"...
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 class RestrictiveTextBox extends TextBox { public-init var maxLen = 10; public-init var bDigitsOnly: Boolean; public-init var filter: function (repl: String): String; public-init var onFull: function (): Void; function DigitsOnly(repl: String): String { // Let regex do the job for us... Not efficient but that's answer to user input, performance isn't critical repl.replaceAll("\\D+", ""); } init { columns = maxLen; if (bDigitsOnly) { // A common case filter = DigitsOnly; } } override function replaceSelection(replacingText: String): Void { // Find out what portion of text is replaced def pos1 = Math.min(dot, mark); def pos2 = Math.max(dot, mark); // We cannot change parameters... :-( var rt = replacingText; if (filter != null) { rt = filter(rt); } // The expected result var newText = "{rawText.substring(0, pos1)}{rt}{rawText.substring(pos2)}"; // Are we exceeding the limit? if (newText.length() > maxLen) { // Yes, compute how much var diff = newText.length() - maxLen; // We are already at max if (diff >= rt.length()) return; // Just don't insert it // Truncate the input to fit in the box rt = rt.substring(0, diff); } // Insert the perhaps truncated string super.replaceSelection(rt); if (rawText.length() == maxLen and onFull != null) { onFull(); } } } def formFont = Font { size: 24 } def inputDay: RestrictiveTextBox = RestrictiveTextBox { maxLen: 2 bDigitsOnly: true onFull: function (): Void { inputMonth.requestFocus() } font: formFont } def inputMonth: RestrictiveTextBox = RestrictiveTextBox { maxLen: 2 bDigitsOnly: true onFull: function (): Void { inputYear.requestFocus() } font: formFont } def inputYear: RestrictiveTextBox = RestrictiveTextBox { maxLen: 4 bDigitsOnly: true onFull: function (): Void { valButton.requestFocus() } font: formFont } def valButton: Button = Button { text: "OK", font: formFont, onKeyPressed: function (e: KeyEvent): Void { valButton.action() } action: function (): Void { println("{inputDay.text}/{inputMonth.text}/{inputYear.text}"); } } def dateInput = HBox { spacing: 10 content: [ inputDay, inputMonth, inputYear, valButton ] } Stage { title: "Test Forum" scene: Scene { width: 300 height: 100 content: dateInput } } inputDay.requestFocus();)
PhiLho je suis entrain d'étudier ton code.
Est-ce que tu peux m'expliquer ce que fais exactement ce bout de code?
Et aussi là :p
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 // The expected result var newText = "{rawText.substring(0, pos1){rt}{rawText.substring(pos2)}";
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if (newText.length() > maxLen) { /** Oui on calcule de combien on dépasse */ var diff = newText.length() - maxLen; /** Nous sommes déjà au max */ if (diff >= rt.length()) return; // On ne l'insert pas // Tronquer l'entrée pour s'adapter à la boîte rt = rt.substring(0, diff); }
Partager