GUI 3 JavaFX Mer interaksjon Hvordan gi input :l programmet INF1010 Stein Michael Storleer
Innhold 1. Ta opp tråden fra sist 2. Input med TextField 3. Anonyme klasser 4. Lytte på alle noder i et grid 5. FileChooser 6. Alert (dialogbokser)
Superklassen til alle JavaFX applikasjonsklasser Livssyklus: Denne klassen er startpunktet for alle JavaFX-applikasjoner. JavaFXs runtime-system utfører disse operasjonene i denne rekkefølgen når Apprlication.launch(...) kalles: 1. Lager et objekt/instans av subklassen til Application 2. kaller init()-metoden 3. Kaller start(javafx.stage.stage)-metoden 4. Venter på at applikasjonen skal avsluttes, noe som skjer når et av følgende inntreffer: Applikasjonen kaller metoden javafx.application.platform.exit() Det siste vinduet er blitt lukket og attributtet implicitexit i Plattform er true 5. Metoden stop() kalles Merk at start-metoden er abstrakt og må defineres () i applikasjonsklassen.
public class ButtonFrame1FX extends Application { public void start(stage hovedscenen) { Button knappp = new Button("Si «hei»"); EventHandler<ActionEvent> knappelytter = new MinLytterKlasse( ) ; knappp.setonaction(knappelytter); FlowPane pane = new FlowPane(); pane.getchildren().addall(knappp); Scene scene = new Scene(pane, 100, 50); hovedscenen.settitle("hovedscene"); hovedscenen.setscene(scene); hovedscenen.show(); public class MinLytterKlasse implements EventHandler<ActionEvent> { public void handle(actionevent event) { System.out.println("Dette blir skrevet når hendelsen inntreffer..");
public class MinGUIApp extends Application { public void start(stage vindu) throws Exception { BorderPane border = new BorderPane(); HBox hbox = nyhbox(); border.settop(hbox); border.setleft(vboxmedtekst()); border.setcenter(mingridpane()); // GridPane border.setright(nyvboxmedlenker()); // VBox border.setbottom(bunnboks()); // HBox Scene scene = new Scene(border, 800, 600); vindu.setscene(scene); vindu.show(); vindu.settitle("eksempel med interaksjon ved knappetrykk"); private HBox nyhbox() { class KnappeLytter implements EventHandler<ActionEvent> { private VBox nyvboxmedlenker() { private VBox vboxmedtekst() { private GridPane mingridpane() { class ByttSmilOgFugl implements EventHandler<ActionEvent> { private HBox bunnboks() { private class Avslutt implements EventHandler<ActionEvent> {
Si «hei» setonaction(eventhandler<actionevent>) Dette objektet synes på skjermen (som en knapp) EventHandler<ActionEvent> Button EventHandler<ActionEvent> knapp knappelytter Button knapp = new Button("Si «hei»"); EventHandler<ActionEvent> knappelytter = new MinLytterKlasse( ) ; knapp.setonaction(knappelytter); handle(actionevent ae) Kode for det som skal skje når hendelsen forekommer Et objekt av en klasse som implementerer EventHandler<ActionEvent> public class MinLytterKlasse implements EventHandler<ActionEvent> { public void handle(actionevent ae) { System.out.println( Skrives når hendelsen inntreffer..");
Input ved hjelp av tekstfelter og lyttende knapp
TextField tekstfelt = new TextField("Skriv noe i dette feltet..."); tekstfelt.setprefsize(300, 30) ; Button levertekst = new Button("Trykk for å lese inn teksten"); levertekst.setprefsize(200, 30); EventHandler<ActionEvent> lesinntekst = new LesTekstfelt(tekstfelt); levertekst.setonaction(lesinntekst); private class LesTekstfelt implements EventHandler<ActionEvent> { TextField tekstfelt = null; LesTekstfelt(TextField tf) { tekstfelt = tf; public void handle(actionevent knapptrykka) { String s = tekstfelt.gettext(); tekstfelt.clear(); System.out.println("Teksten som ble skrevet inn var «" + s + "»");
Anonyme klasser
private HBox bunnboks() { HBox hbox = new HBox();............ Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); EventHandler<ActionEvent> trykkavsluttknapp = new Avslutt(); avslutt.setonaction(trykkavsluttknapp); hbox.getchildren().addall(tekstfelt, levertekst, avslutt); return hbox; class Avslutt implements EventHandler<ActionEvent> { public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit();
Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); class Avslutt implements EventHandler<ActionEvent> { public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); EventHandler<ActionEvent> trykkavsluttknapp = new Avslutt(); avslutt.setonaction(trykkavsluttknapp); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);
Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); class Avslutt implements EventHandler<ActionEvent> { public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); EventHandler<ActionEvent> trykkavsluttknapp = new EventHandler<ActionEvent>( ){ public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); avslutt.setonaction(trykkavsluttknap); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);
Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); EventHandler<ActionEvent> trykkavsluttknapp = new EventHandler<ActionEvent>( ){ public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); avslutt.setonaction(trykkavsluttknap); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);
Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); EventHandler<ActionEvent> trykkavsluttknapp = new EventHandler<ActionEvent>( ){ Anonym klasse public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); avslutt.setonaction(trykkavsluttknap); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);
Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); avslutt.setonaction( new EventHandler<ActionEvent>( ){ ); public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);
Samme som forrige side skrevet om som lambda-funksjon Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); avslutt.setonaction( (avsluttknapptrykka) -> { javafx.application.platform.exit(); ); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);
TextField tekstfelt = new TextField("Skriv noe i dette feltet..."); tekstfelt.setprefsize(300, 30) ; // javafx.scene.control Button levertekst = new Button("Trykk for å lese inn teksten"); levertekst.setprefsize(200, 30); levertekst.setonaction(new EventHandler<ActionEvent>() { public void handle(actionevent knapptrykka) { String s = tekstfelt.gettext(); tekstfelt.clear(); System.out.println("Teksten som ble skrevet inn var «" + s + "»"); ); Button avslutt = new Button("Lukk vinduet og avslutt programmet"); avslutt.setprefsize(200, 30); avslutt.setonaction(new EventHandler<ActionEvent>() { ); public void handle(actionevent avsluttknapptrykka) { javafx.application.platform.exit(); hbox.getchildren().addall(tekstfelt, levertekst, avslutt);
String[][] tekstarray = { {" ", "4", "2", "3", {" ", "2", "1", "4", {"4", " ", " ", " ", {"3", "1", "4", " " ; GridPane rutepanel = new GridPane(); for (int i= 0; i < tekstarray.length; i++) { for (int j = 0; j < tekstarray[i].length; j++) { StackPane s = new StackPane();... Text tekst = new Text(tekstArray[i][j]); tekst.setonmousepressed( new SkiftTekst(tekst) ); s.getchildren().add(tekst); rutepanel.add(s, j, i);
for (int i= 0; i < tekstarray.length; i++) { for (int j = 0; j < tekstarray[i].length; j++) { StackPane s = new StackPane(); Text tekst = new Text(tekstArray[i][j]); class SkiftTekst implements EventHandler<MouseEvent> { Text tekst; SkiftTekst(Text t) {tekst = t; public void handle(mouseevent me) { System.out.println("Klikk i " + me.getscenex()); System.out.println( tekst.tostring() ); System.out.println( me.tostring() ); String nytekst = null; if (tekst.gettext().equals(" ")) nytekst = "0"; else if (tekst.gettext().equals("9")) nytekst = " "; else { Integer i = Integer.parseInt( tekst.gettext() ) + 1 ; nytekst = new String(i.toString()); tekst.settext(nytekst); tekst.setonmousepressed( new SkiftTekst(tekst) ); s.getchildren().add(tekst); rutepanel.add(s, j, i);
Dialogbokser for å velge filer http://docs.oracle.com/javafx/2/ui_controls/file-chooser.htm
Dialogvinduer http://code.makery.ch/blog/javafx-dialogs-official/
The Alert class subclasses the Dialog class, and provides support for a number of pre-built dialog types that can be easily shown to users to prompt for a response. Therefore, for many users, the Alert class is the most suited class for their needs (as opposed to using Dialog directly). Alternatively, users who want to prompt a user for text input or to make a choice from a list of options would be better served by using TextInputDialog and ChoiceDialog, respectively.
public class Dialog01 extends Application { public void start(stage hovedscenen) { Alert alert = new Alert(AlertType.INFORMATION); alert.settitle("dialoginformasjon"); alert.setheadertext("dette er et dialogvindu av type INFORMATION"); alert.setcontenttext("dette er nest siste forelesning i INF1010."); alert.showandwait();
public class Dialog02 extends Application { public void start(stage hovedscenen) { Alert alert = new Alert(AlertType.CONFIRMATION); alert.settitle("dialog for å bekrefte..."); alert.setheadertext("dette er en dialogboks av type AlertType.CONFIRMATION"); alert.setcontenttext("er dette greit for dere?"); Optional<ButtonType> svar = alert.showandwait(); if (svar.get() == ButtonType.OK){ System.out.println("Brukeren svarte ved å trykke på OK-knappen"); else { System.out.println("Brukeren lukka vinduet eller trykka på CANCEL-knappen");