Fortegnelse 5 bruger java.util. par
klasse til bekvemt at gemme et par emner: søgeteksten og den boolske sagsfølsomme søgningsværdi. Der er installeret en resultatkonverter til at konvertere dialogboksens søgningstekstfelt og store og små bogstaver med afkrydsningsfeltet til en Par
objekt, der returneres fra opkald()
metode. Denne konvertering sker kun når Søg
der klikkes på knappen; det sker ikke når Afbestille
er klikket.
Leder du efter search.png?
Fortegnelse 5 er afhængig af en ekstern search.png
billedfil, som er inkluderet i denne artikels kodearkiv.
Kompilér liste 5 som følger:
javac SearchDialog.java
Kør den resulterende applikation som følger:
java SearchDialog
Figur 18 afslører den resulterende dialog.
Figur 18: Søgedialogboksen er som standard ingen søgetekst og en sagsfølsom søgning
Antag at du kommer ind JavaFX
i tekstfeltet, og marker afkrydsningsfeltet. Efter at have klikket Søg
, skal du overholde følgende output på standardudgangsstrømmen:
Søgetekst = JavaFX, Skift mellem store og små bogstaver = sand
Spørgsmål: Kan du give mig flere oplysninger om JavaFXs support til standard- og brugerdefinerede dialoger?
EN: Se JavaFX Dialogs for yderligere standardeksempler og brugerdefinerede dialogeksempler (inklusive en brugerdefineret login-dialog) og for at lære om dialogstyling og indstilling af dialogejeren og modaliteten.
Spinner kontrol
Spørgsmål: Hvad er en spinner?
EN: EN spinner er en tekstlinjekontrol med en linje, der lader brugeren vælge et tal eller en objektværdi fra en ordnet rækkefølge af sådanne værdier. Spinnere giver typisk et par små pileknapper til at gå gennem elementerne i sekvensen. Tastaturet er pil op
/pil ned
tasterne cykler også gennem elementerne. Brugeren kan også få lov til at skrive en (lovlig) værdi direkte i spinderen. Selvom kombinationsbokse giver lignende funktionalitet, foretrækkes spinnere undertiden, fordi de ikke kræver en rulleliste, der kan skjule vigtige data, og også fordi de giver mulighed for funktioner såsom indpakning fra den maksimale værdi tilbage til den mindste værdi (f.eks. fra det største positive heltal til 0).
Spørgsmål: Hvordan implementeres en spinner?
EN: En spinner implementeres som en instans af javafx.scene.control.Spinner
kontrolklasse. Denne klasse er afhængig af det abstrakte javafx.scene.control.SpinnerValueFactory
klasse til at give kontrolelementets model (rækkevidde af brugervalgbare værdier af en bestemt type). I øjeblikket er de eneste understøttede modeller defineret af dets indlejrede DoubleSpinnerValueFactory
, IntegerSpinnerValueFactory
og ListSpinnerValueFactory
klasser.
Spørgsmål: Hvordan opretter jeg en spinner?
EN: Du opretter en spinner ved at ringe til en af Spinner
's konstruktører. For eksempel, Spinner (int min, int max, int initialValue)
opretter en spinner til valg af en af heltalsværdierne fra min
igennem maks
. Den oprindeligt valgte værdi identificeres med startværdi
. Hvis denne værdi ikke er i min
/maks
rækkevidde, min
værdi bliver den oprindeligt valgte værdi.
Spinner (int min, int max, int initialValue)
er en komfortkonstruktør, der installerer en forekomst af IntegerSpinnerValueFactory
klasse med disse værdier som model. Hvis du foretrækker at arbejde direkte med IntegerSpinnerValueFactory
, kan du instantiere denne klasse og videregive dens henvisning til Spinner (SpinnerValueFactory valueFactory)
konstruktør. Alternativt kan du oprette en tom spinner via Spinner ()
konstruktør og påberåbe sig Spinner
's void setValueFactory (SpinnerValueFactory værdi)
metode til at installere dette fabriksobjekt.
Spørgsmål: Kan du give et simpelt eksempel på drejepunkterne med heltal og dobbelt præcision?
EN: Tjek Listing 6.
Liste 6. SpinnerDemo.java
(version 1)
import javafx.application.Application; importere javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Spinner; import javafx.scene.layout.GridPane; import javafx.stage.Stage; offentlig klasse SpinnerDemo udvider applikationen {@Override public void start (Stage primaryStage) {Spinner ispinner = new Spinner (1, 10, 2); Spinner dspinner = ny Spinner (1,5, 3,5, 1,5, 0,5); GridPane-gitter = nyt GridPane (); grid.setHgap (10); grid.setVgap (10); grid.setPadding (nye Insets (10)); grid.add (ny etiket ("Integer Spinner"), 0, 0); grid.add (ispinner, 1, 0); grid.add (ny etiket ("Double Spinner"), 0, 1); grid.add (dspinner, 1, 1); Scene scene = ny scene (gitter, 350, 100); primaryStage.setTitle ("SpinnerDemo"); primaryStage.setScene (scene); primaryStage.show (); }}
Liste 6's Start()
metoden opretter først et heltal spinner via den førnævnte konstruktør. Derefter skabes en dobbelt præcision med flydende spinner via Spinner (dobbelt min, dobbelt max, dobbelt initialValue, dobbelt beløbToStepBy)
konstruktør. Denne konstruktør modtager enhederne, hvor spinneren skal forøges eller mindskes via den værdi, der sendes til beløbToStepBy
, som tilfældigvis er 0.5
.
Fortsætter, Start()
opretter og konfigurerer en gitterrude beholder og udfylder 2-række-for-2-kolonne gitteret med disse spinnere og tilknyttede etiketter. Derefter oprettes scenen baseret på gitteret og konfigurerer / viser scenen.
Kompilér liste 6 som følger:
javac SpinnerDemo.java
Kør den resulterende applikation som følger:
java SpinnerDemo
Figur 19 afslører den resulterende brugergrænseflade.
Figur 19: Klik på hver spinders pile for at øge / mindske gennem værdiområdet
Spørgsmål: Jeg vil gøre de tidligere spinnere redigerbare. Hvordan udfører jeg denne opgave?
EN: Opkald Spinner
's void setEditable (boolsk værdi)
metode, passerer rigtigt
til værdi
. Jeg har oprettet en anden version af SpinnerDemo
at demonstrere. Se kildekoden til denne artikels kodearkiv.
Spørgsmål: Når jeg gør de tidligere spinnere redigerbare, skal du skrive ulovlige tegn (såsom bogstaver) i tekstfeltet og trykke på Gå ind
nøgle, en undtagelse kastes. Undtagelsen er java.lang.NumberFormatException
for det heltal-baserede spinner og java.lang.RuntimeException
(indpakning java.text.ParseException
) til dobbelt præcision med flydende spinner. Hvordan kan jeg forhindre, at denne undtagelse smides?
EN: Du kan forhindre, at denne undtagelse smides, ved at installere en forekomst af en abstrakt underklasse javafx.util.StringConverter
klasse (hvor T
er den type, der konverteres til eller fra Snor
) som SpinnerValueFactory
konverter. Dette objekt vil fange undtagelsen ved at blive kastet og handle.
Spinner
bruger en javafx.scene.control.TextField
objekt som redaktør til opnåelse af brugerinput. Da et tekstfelt kan gemme ethvert tegn, kan upassende tegn såsom bogstaver i en numerisk kontekst indtastes. Når brugeren har trykket på Gå ind
, sendes input til SpinnerValueFactory
konverterers T fromString (strengstreng)
metode. For fabrikanter med heltal eller dobbelt præcision med flydende punkt, T
er enten Heltal
eller Dobbelt
. Konvertering fra en streng med ulovlige tegn til et nummer resulterer i, at undtagelsen kastes fra fromString ()
. Få en henvisning til den aktuelle konverter, og installer en ny konverter, hvis fromString ()
metode påberåber den anden konverterers fromString ()
metode i en prøve
erklæring med en passende fangst
blok. Listing 7 præsenterer et program, der udfører denne opgave.
Liste 7. SpinnerDemo.java
(version 3)
import javafx.application.Application; importere javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Spinner; import javafx.scene.layout.GridPane; import javafx.stage.Stage; importere javafx.util.StringConverter; offentlig klasse SpinnerDemo udvider applikationen {@ Override offentlig ugyldig start (Stage primaryStage) {Spinner ispinner = ny Spinner (1, 10, 2); ispinner.setEditable (sand); StringConverter sci = ispinner.getValueFactory (). GetConverter (); StringConverter sci2 = new StringConverter () {@Override public Integer fromString (String value) {try {return sci.fromString (value); } fange (NumberFormatException nfe) {System.out.println ("Dårligt heltal:" + værdi); returnere 0; }} @ Override offentlig String toString (Heltalsværdi) {return sci.toString (værdi); }}; ispinner.getValueFactory (). setConverter (sci2); Spinner dspinner = ny Spinner (1,5, 3,5, 1,5, 0,5); dspinner.setEditable (sand); StringConverter scd = dspinner.getValueFactory (). GetConverter (); StringConverter scd2 = ny StringConverter () {@Override public Double fromString (String value) {prøv {return scd.fromString (værdi); } fange (RuntimeException re) {System.out.println ("Dårlig dobbelt:" + værdi); System.out.println ("Årsag:" + re.getCause ()); returnere 0,0; }} @ Override public String toString (Double value) {return scd.toString (value); }}; dspinner.getValueFactory (). setConverter (scd2); GridPane-gitter = nyt GridPane (); grid.setHgap (10); grid.setVgap (10); grid.setPadding (nye Insets (10)); grid.add (ny etiket ("Integer Spinner"), 0, 0); grid.add (ispinner, 1, 0); grid.add (ny etiket ("Double Spinner"), 0, 1); grid.add (dspinner, 1, 1); Scene scene = ny scene (gitter, 350, 100); primaryStage.setTitle ("SpinnerDemo"); primaryStage.setScene (scene); primaryStage.show (); }}
Kompilering Listing 7 (javac SpinnerDemo.java
) og kør den resulterende applikation (java SpinnerDemo
). Du skal observere fejlmeddelelser svarende til dem, der vises nedenfor, når du indtaster ulovlige tegn i en spinders tekstfelt:
Dårligt heltal: a2 Dårligt dobbelt: b1.5 Årsag: java.text.ParseException: Kan ikke deles: "b1.5"
Spørgsmål: Jeg har brug for en strengbaseret spinner. Hvordan får jeg en?
EN: Du kan få en strengbaseret spinner via Spinner (ObservableList items)
konstruktør. For eksempel viser følgende kodefragment, hvordan du opretter en spinner til valg af et hverdagsnavn:
Liste weekDays = Arrays.asList ("mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag", "søndag"); ObservableList obsWeekDays = FXCollections.observableList (weekDays); Spinner sspinner = ny Spinner (obsWeekDays);
Jeg uddrag dette kodefragment fra en fjerde version af SpinnerDemo
applikation (se kildekoden til denne artikels kildearkiv). Når du kører applikationen, kan du se spinderen vist i figur 20.
Figur 20: Forsøg på at indtaste tekst i editoren, der ikke nøjagtigt matcher et af hverdagens navne, resulterer i java.lang.UnderstøttetOperationException
bliver kastet
Spørgsmål: Kan du give mig flere oplysninger om JavaFXs support til spinners?
EN: Tjek JavaFX 8-dokumentationen på Spinner
og SpinnerValueFactory
for at få flere oplysninger om denne kontrol og dens model. Du vil muligvis også køre en Google-søgning for at finde ud af, hvordan andre bruger denne kontrol.
Tekstformatering
Spørgsmål: Hvordan understøtter JavaFX tekstformatering?
EN: JavaFX understøtter tekstformatering ved at give javafx.scene.control.TextFormatter
klasse med sin indlejrede Lave om
klasse. Desuden det abstrakte javafx.scene.control.TextInputControl
klasse (moderklassen til Tekstfelt
og javafx.scene.control.TextArea
) har fået en textFormatter
egenskab, så enhver underklasse automatisk understøtter tekstformatering.
Spørgsmål: Hvilke typer tekstformatering understøttes?
EN:Tekstformatering
understøtter to slags tekstformatering: værdi og ændring. EN værdi formaterer kaldes, når du trykker på Gå ind
efter indtastning af teksten. EN skift formater kaldes til hver tekstsletning, tilføjelse af tekst og ændring af tekstudskiftning for den fokuserede tekstinputkontrol. Disse formater kan bruges separat eller sammen.
Spørgsmål: Hvordan specificeres værdi- og ændringsformater?