JavaFx alkalmazásban InvocationTargetException amikor TextFieldből akarok kiolvasni adatot

0 értékelés
140 megtekintés
Arnold Haladó Felhasználó (126 pont) kérdezte Feb 21.
Arnold szerkesztett Feb 21.

Objektum orientált módon szeretném megcsinálni a JavaFX appomat, az első gondja rögtön, hogy az egyik Java osztályból (Controller.java) nem tudom átvinni a másik osztályba (Szamitas.java) a TextFieldből kiolvasott adatot, mert InvocationTargetException-t dob.

A Controller.java tartalma:

package oop;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class Controller implements Initializable {

    @FXML
    public Label label;
    @FXML
    public TextField input;

    @FXML
    public void handleButtonAction(ActionEvent event) {
        Szam();
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }

    public void Szam() {
        label.setText("Az input mezőbe bevitt szám: " + input.getText());
        Szamitas szami = new Szamitas();
        szami.indit();
    }
}

És a Szamitas.java tartalma:

package oop;

public class Szamitas {

    public void indit() {
        Controller con = new Controller();
        System.out.println("A beírt szám az Input mezőbe - Számítás oldalról nézve: " + con.input.getText());
    }
}

Miért nem tudja átvinni az egyik osztályból a másik osztályba az Input mező értékét, amit kiolvas a program?



És az Konzolon a szöveg, ami megjelenik:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)

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:394)

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:432)

at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)

at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)

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(Thread.java:748)

Caused by: java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)

at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)

at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)

... 48 more

Caused by: java.lang.NullPointerException

at oop.Szamitas.indit(Szamitas.java:7)

at oop.Controller.Szam(Controller.java:31)

at oop.Controller.handleButtonAction(Controller.java:20)

... 58 more

2 Válasz

0 értékelés
kispopey (30 pont) válaszolta meg Már 14.
Arnold kiválasztva Már 14.
 
Legjobb válasz

Szia.

Én is csak most kezdtem tanulni a programozást, így tudom, milyen frusztráló tud lenni egy-egy hiba.
Gondolkoztam, és úgy néz ki, hogy sikerült megoldani a problémát.

Nem vagyok biztos benne, hogy az okozta a hibát, amit én megkerültem, mindenesetre itt a válaszom.

Szerintem a problémát az okozta, hogy ezzel a sorral:
,,label.setText("Az input mezőbe bevitt szám: " + input.getText());"

Az inputodat "felhasználtad", viszont nem mentetted el, viszont ezek után megpróbáltad megint meghívni a másik osztályban.

Én úgy oldottam meg, hogy az inputot kimentettem egy változóba:
,,int inputka = Integer.parseInt(input.getText());"

Majd meghívtam a másik osztályban létrehozott metódust úgy, hogy átadtam neki az inputot:
,,szami.indit(inputka);"


A Controller.java tartalma:

package szamitas;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class Controller implements Initializable {
    Szamitas szami = new Szamitas();
    
    @FXML
    public Label label;
    @FXML
    public TextField input;

    @FXML
    public void handleButtonAction(ActionEvent event) {
        szam();
    }

        public void szam() {
        int inputka = Integer.parseInt(input.getText());
        label.setText("Az input mezőbe bevitt szám: " + inputka);
        szami.indit(inputka);
    }

    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }
}


A Szamitas.java tartalma:

package szamitas;

public class Szamitas {
    
    
     public void indit(int inputka){
        System.out.println("Az input mezőbe beírt szám - Számítás oldalról nézve: " + inputka);            
     }
}

Arnold Haladó Felhasználó (126 pont) szólt hozzá Már 14.
Köszi! :) Szuper, sikerült! Igen, ez lehetett a gond, de most már jó minden :) Köszi még egyszer.
0 értékelés
balazs79 Szakértő (400 pont) válaszolta meg Feb 24.

Szia!

És ha csak paraméterként átadnád egy konstruktornak?

public void Szam(String label)

Üdv.

Balázs

Arnold Haladó Felhasználó (126 pont) szólt hozzá Feb 24.
Sajnos nem működik. Sima változókat át tudok vinni egyik osztályból a másikba, de a TextFieldnek az értékét valamiért nem :(
...