NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Nastavení EventHandler v javafx

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
vlastajuracka:25.10.2015 9:20

Čau lidi mam třídu kde mám metodu která mi vypíše 10 buttonu ale u každé bych ctrěl mít jinej Handle evet.. moc nevím jk na to :/ Díky za každou odpověď :)

package zkouseniblbosti;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;

public class Metody {

    public void napis(TextField textfield, AnchorPane anchorPane) {
        Button[] jmeno = new Button[11];
        double x = 0;
        double y = 0;
           jmeno[i] = new Button();
            jmeno[i].setId("cislo" + i);
            jmeno[i].setLayoutX(x);
            jmeno[i].setLayoutY(y);
            x = 0;
            y = 0;
            jmeno[i].setMnemonicParsing(false);
            jmeno[i].setPrefHeight(50);
            jmeno[i].setPrefWidth(50);
            jmeno[i].setText("" + i);
            jmeno[i].setOnAction(new EventHandler<ActionEvent>() {

                public void handle(ActionEvent event) {
                    textfield.appendText("Tady"); //Tady bych chtěl aby to vypisovalo něco jiného
                }
            });
            anchorPane.getChildren().add(jmeno[i]);
        }
    }
}
 
Odpovědět
25.10.2015 9:20
Avatar
Odpovídá na vlastajuracka
Petr Štechmüller:25.10.2015 9:48

Můžeš si vytvořit pole tech handleru a pak to sparovat podle indexu, nebo prostě budeš každé tlačítko vytvářet extra zvlášť.

Nahoru Odpovědět
25.10.2015 9:48
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
vlastajuracka:25.10.2015 9:57

A jk tam udělam to pole ?

Editováno 25.10.2015 9:57
 
Nahoru Odpovědět
25.10.2015 9:57
Avatar
Odpovídá na vlastajuracka
Petr Štechmüller:25.10.2015 10:23

Je to sice bordel kod, ale funguje to:

1. Ve třídě Metody si vytvoříš pole handlerů takto:

EventHandler[] events = new EventHandler[10]; //10 = pocet tlacitek
2. Jsou dvě možnosti, jak ty handlery inicializovat
Buď přímo při vytváření toho pole, ale v tom se uz ani prase nevyzná. Vypadalo by to asi takto:
    EventHandler[] events = new EventHandler[]{
        new EventHandler<ActionEvent>(){
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Event handle 0");
            }
        },
        events[1] = new EventHandler<ActionEvent>(){
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Event handle 1");
            }
        }
};

- Nebo ta pěknější cesta, že to inicializuješ až v konstruktoru a to by vypadalo takto:

    public Metody() {
    events[0] = new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent event) {
            System.out.println("Event handle 0");
        }
    };
    new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent event) {
            System.out.println("Event handle 1");
        }
    };
}

3. Teď už stačí v metode napis upravit řádek s metodou setOnAction na toto:

jmeno[i].setOnAction(events[i]);

Tento kód sice bude fungovat, ale pokud vytváříš v cyklu tlačítka, kde každé má dělat něco jiného, tak je asi něco špatně. Měl by jsi mít každé tlačítko vytvořeno extra zvlášť.

Nahoru Odpovědět
25.10.2015 10:23
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:25.10.2015 10:38

Co treba

Tlacitko[1].setOnAction(e -> { kod pro tlacitko)};
Tlacitko[2]…set.....
Nahoru Odpovědět
25.10.2015 10:38
Vi veri universum vivus vici
Avatar
Odpovídá na Tomáš Brůna
vlastajuracka:25.10.2015 10:39

Ja bych chtel aby to fungovalo nějak takhle :p

package zkouseniblbosti;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;

public class Metody {

    public void napis(TextField textfield, AnchorPane anchorPane) {
        Button[] jmeno = new Button[10];
        double x = 0;
        double y = 0;
        for (int i = 9; i >= 0; i--) {
            jmeno[i] = new Button();
            jmeno[i].setId("cislo" + i);
            jmeno[i].setLayoutX(x);
            jmeno[i].setLayoutY(y);
            x = 0;
            y = 0;
            jmeno[i].setMnemonicParsing(false);
            jmeno[i].setPrefHeight(50);
            jmeno[i].setPrefWidth(50);
            jmeno[i].setText("" + i);
            EventHandler[] events = new EventHandler[]{
                new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent event) {
                    }
                }};
            events[i] = new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    System.out.println(i);
                }
            };
            anchorPane.getChildren().add(jmeno[i]);
        }
    }
}

Nešlo by to nějak udělat ? Nefunguje samozřejmě toto

public void handle(ActionEvent event) {
                    System.out.println(i);
                }

musi to byt final

Editováno 25.10.2015 10:39
 
Nahoru Odpovědět
25.10.2015 10:39
Avatar
Odpovídá na Tomáš Brůna
vlastajuracka:25.10.2015 10:42

Todle funguje ale chtěl bych jestli by tam neslo dat proste to i

 
Nahoru Odpovědět
25.10.2015 10:42
Avatar
Odpovídá na Tomáš Brůna
vlastajuracka:25.10.2015 10:42

Takto bych to chtěl

jmeno[i].setOnAction(new EventHandler<ActionEvent>() {

                public void handle(ActionEvent e) {
                    System.out.println(i);
                }
            });
 
Nahoru Odpovědět
25.10.2015 10:42
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:25.10.2015 10:47

Zkus odstranit tu metodu a ten println dej mimo ni

Nahoru Odpovědět
25.10.2015 10:47
Vi veri universum vivus vici
Avatar
Odpovídá na Tomáš Brůna
vlastajuracka:25.10.2015 10:51

Bohuzel nefunguje..

 
Nahoru Odpovědět
25.10.2015 10:51
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:25.10.2015 11:10
jmeno[i].setOnAction(new EventHandler<ActionEvent>() {
                    System.out.println(i);
           });
Nahoru Odpovědět
25.10.2015 11:10
Vi veri universum vivus vici
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:25.10.2015 11:20

a ted mi dochazi ze prece n tom Handleru nemáš proměnnou i

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
25.10.2015 11:20
Vi veri universum vivus vici
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.