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.

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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)
Tak stačí ti ten poslední řádek - at
mim.KontrolaMenu.Jmeno(KontrolaMenu.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).
java.lang.NullPointerException
at mim.KontrolaMenu.Jmeno(KontrolaMenu.java:27)
V KontrolaMenu.Jmeno je nickname null a snažíš sa mu setnúť meno nickname.setText(Jmeno);
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);
}
}
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)
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
:/.
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
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ě
Zobrazeno 10 zpráv z 10.