Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: JavaFX, něco si neuvědomuji

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

Aktivity
Avatar
mimacala
Člen
Avatar
mimacala:21.3.2018 16:06

Zdravím všechny rádce a rádkyně :D.
Prosím, co si neuvědomuji, že mi to háže "java.lang.Nu­llPointerExcep­tion".
Děkuji za odpovědi :).
Chybami se člověk učí :))

loginController

public class loginController implements Initializable{
        public LoginModel loginModel = new LoginModel();




        @FXML
        private Label popis;
        @FXML
        private Label status;
        @FXML
        private PasswordField heslo;
        @FXML
        private TextField jmeno;
        @FXML
        private Button prihlasit;










        @FXML
        public void Kontrola(ActionEvent event) {
                try {
                        if(loginModel.isLogin(jmeno.getText(), heslo.getText())) {

                                popis.setText("Údaje jsou v pořádku");

                                KontrolaMenu kontrola = new KontrolaMenu();
                                //zapnutí druhé scény
                                Stage stage = new Stage();

                                FXMLLoader fxmlLoader = new FXMLLoader();

                                Pane root = fxmlLoader.load(getClass().getResource("menu.fxml"));



                                kontrola.Jmeno(jmeno.getText());
                                Scene scene = new Scene(root);

                                stage.setScene(scene);

                                stage.show();


                        } else {

                                popis.setText("Údaje jsou v pořádku NE");

                        }
                } catch (Exception e) {
                        popis.setText("Neplatné přihlašovací údaje2!");
                        e.printStackTrace();
                }

        }

KontrolaMenu

package mim;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class KontrolaMenu implements Initializable{

        @FXML
        private Label nickname;



        @Override
        public void initialize(URL arg0, ResourceBundle arg1) {
                // TODO Auto-generated method stub

        }

        public void Jmeno(String Jmeno) {



                nickname.setText(Jmeno);


        }



}
Editováno 21.3.2018 16:07
 
Odpovědět
21.3.2018 16:06
Avatar
mimacala
Člen
Avatar
mimacala:21.3.2018 16:10

Ještě zde chyba

java.lang.NullPointerException
        at mim.KontrolaMenu.Jmeno(KontrolaMenu.java:27)
        at mim.loginController.Kontrola(loginController.java:65)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.Trampoline.invoke(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
        at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
        at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Node.fireEvent(Node.java:8413)
        at javafx.scene.control.Button.fire(Button.java:185)
        at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
        at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
        at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
        at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
        at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
        at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
        at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:417)
        at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
        at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
        at com.sun.glass.ui.View.notifyMouse(View.java:937)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
        at java.lang.Thread.run(Unknown Source)
 
Nahoru Odpovědět
21.3.2018 16:10
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:21.3.2018 16:24

Tak stačí ti ten poslední řádek - at mim.KontrolaMe­nu.Jmeno(Kontro­laMenu.java:27)
To znamená, že nickname nemáš inicializovaný, takže je prostě null.
Jen jej deklrauješ (private Label nickname;) ale nikde nenaplňuješ. tak vytvoř novou instanci tohoto Labelu.

Nicméně fuj fuj fuj. Pokud si nevíš rady s null pointerem, tak soudím, že jsi začátečník. Proč se hned ženeš do FX, když nemáš nějaké zkušenosti?:( struktura kódu děs, i když je hezké, že se už snažíš o OOP, ale ten kód je na první pohled příšerný.
Navíc když vytváříš FX aplikaci, tak by měla být v metodě start(Stage). Mrkni na nějaký tutoriál třeba na youtube (jsou tam pěkné seriály).

Nahoru Odpovědět
21.3.2018 16:24
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na mimacala
Matúš Olejník:21.3.2018 16:25
java.lang.NullPointerException
        at mim.KontrolaMenu.Jmeno(KontrolaMenu.java:27)

V KontrolaMenu.Jme­no je nickname null a snažíš sa mu setnúť meno nickname.setTex­t(Jmeno);

Nahoru Odpovědět
21.3.2018 16:25
/* I am not sure why this works but it fixes the problem */
Avatar
mimacala
Člen
Avatar
mimacala:21.3.2018 17:50

Moc děkuji, již je to bez chyby.
Bohužel se stále Label nezmění ... :/ , ale do konzole se "Jmeno" vypíše správně :).

package mim;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class KontrolaMenu implements Initializable{

        @FXML
        private Label nickname;


        @Override
        public void initialize(URL arg0, ResourceBundle arg1) {
                // TODO Auto-generated method stub

        }

        public void Jmeno(String Jmeno) {

                System.out.println(Jmeno);
                nickname = new Label();
                nickname.setText(Jmeno);


        }



}
 
Nahoru Odpovědět
21.3.2018 17:50
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na mimacala
pocitac770:21.3.2018 18:13

Label neinicializuj takto, když používáš FXML, důvod, proč ti to házelo null bude ten, že jsi v FX Scene Builderu nepřiřadil id k oné komponentě (řádek nickname = new Label() můžeš vymazat)

Editováno 21.3.2018 18:13
 
Nahoru Odpovědět
21.3.2018 18:13
Avatar
mimacala
Člen
Avatar
Odpovídá na pocitac770
mimacala:21.3.2018 18:32

Ve scene builderu mám vše přiřazené :)
Pokud umažu řádek nickname = new Label(), hlásí mi to onu chybu,
pokud ho tam nechám otevře se druhé okno, ale label an něm nezmění text :/.

 
Nahoru Odpovědět
21.3.2018 18:32
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na mimacala
pocitac770:22.3.2018 0:31

Už to vidím.... Asi

popis.setText("Údaje jsou v pořádku");
KontrolaMenu kontrola = new KontrolaMenu(); // hodně, hodně, hodně špatně
//zapnutí druhé scény
Stage stage = new Stage();

FXMLLoader fxmlLoader = new FXMLLoader();

Pane root = fxmlLoader.load(getClass().getResource("menu.fxml"));



kontrola.Jmeno(jmeno.getText()); //a zde je problém
Scene scene = new Scene(root);

stage.setScene(scene);

stage.show();

Instance onoho "okna", které se ti zobrazuje, tak ji máš v proměnné root, když si ale vytvoříš novou instanci (viz první upozornění), tak děláš změny na něčem, co se ti nikdy neukáže.... Proto sis musel inicializovat v metodě Jmeno ten Label, protože ona inicializace všech komponent na tebou vytvořené instanci KontrolaMenu nikdy neproběhla... tudíž. smaž to, jak jsem říkal, dále ty dva mnou označené řádky a místo toho druhého zkus

((Label)root.getChildren().stream().filter(node -> node.getId().equals("nickname")).findFirst().get()).setText(jmeno.getText());

Kde to "nickname" je id toho Labelu... vyzkoušené to nemám, zkus sám, ostatní pochopí, kam tím mířím, a když tu nebudu tak poradí dál

 
Nahoru Odpovědět
22.3.2018 0:31
Avatar
pocitac770
Tvůrce
Avatar
pocitac770:22.3.2018 0:39

Obecně za to může celkově špatný návrh, kde by jsi měl mít logickou mezivrstvu, co by sloužila pro různé ty "kontroly", a zároveň by také předávala data do jednotlivých oken... Když to tak ale nemáš, tak se to musí řešit takto krkolomně

 
Nahoru Odpovědět
22.3.2018 0:39
Avatar
Lubor Pešek
Člen
Avatar
Nahoru Odpovědět
22.3.2018 8:34
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
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 10 zpráv z 10.