Programmering

JavaFX forbedringer i Java SE 8u40

Forrige 1 2 3 4 Side 3 Næste Side 3 af 4

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, IntegerSpinnerValueFactoryog 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, minvæ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?