Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:

Ahoj vim že už jsem to sem vkládal ale nedostalo se mi odpovědi... Mam problém stim že potřebuju z jedné třídy nastavi label který je ve druhé třídě... Zde posílám program který vám ukáže jk to myslim je jednoduchý ;) Moc prosim o pomoc opravdu bych to potřeboval vedět..
http://ulozto.cz/…iblbosti-zip

 
Odpovědět 6.12.2015 13:04
Avatar
Odpovídá na Petr Kasnal
Petr Štechmüller:

Čau, z kódu to vypadá, že vůbec nemáš tušení, jak fungují třídy.
Ty ve třídě FXMLDocumentCon­troller vytvoříš novou instanci třídy NewClass a vytvoříš okno, to je v pořádku. Problém nastává ve třídě NewClass v metodě buttonAction2, kde znova vytváříš novou instanci třídy FXMLDocumentCon­troller. Tím že vytvoříš novou instanci té třídy, tak se nedostaneš na již existující instanci.

Jako nejjednodušší řešení mě napadá předat třídě NewClass v konstruktoru do parametru ten FXMLDocumentCon­troller aby jsi na něj měl referenci a odtud už můžeš volat metodu setText. Raději Ti to napíšu, protože asi nebudeš vědět, co jsem chtěl říct...

FXMLDocumentCon­troller

public Label label;

    public void buttonAction1() {
        NewClass nc = new NewClass(this); // V konstruktoru předáš referenci na kontroler
        nc.vytvorOkno();
    }

   public void setText(String a) {
       label.setText(a);
      // System.out.println(a); Když použiju todle tk to normálně funguje...
   }

NewClass

 // Vytvoříš si novou proměnnou, která bude referencí na kontroler
 private final FXMLDocumentController controller;
 public TextField textField;

 // V konstruktoru si tu referenci uložíš
 public void NewClass(FXMLDocumentController controller) {
   this.controller = controller;
 }

 public void vytvorOkno() {
     try {
         FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("A.fxml"));
         Parent root = (Parent) fxmlLoader.load();
         Stage stage = new Stage();
         stage.setScene(new Scene(root));
         stage.show();
     } catch (Exception e) {
         e.printStackTrace();
     }
 }

public void buttonAction2() {
    // nakonec můžeš zavolat metodu setText
    controller.setText("a");
}

Neruším za funkčnost, ale teoreticky by to takhle mělo fungovat

Nahoru Odpovědět 6.12.2015 13:15
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Petr Štechmüller
Petr Kasnal:

Jenom taková maličkost konstruktor má být bez void :) Bohužel nefunguje... hodí mi tochybu hned jk zmáčknu button...

 
Nahoru Odpovědět 6.12.2015 13:36
Avatar
Odpovídá na Petr Kasnal
Petr Štechmüller:

Jo, u toho konstruktoru jsem si nevšiml voidu, moje chyba. Co Ti to vypíše za chybu? Vlož ji sem pomocí tlačítka vložit kód

Nahoru Odpovědět 6.12.2015 13:38
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:

Zkusil sem tam dát try a catch ale i když ho dam všude stejně to nefunguje.... tkže ti posílám tkhle celou chybu

Executing D:\Ostatní\Dropbox\Moje Java\ZkoušeniBlbosti\dist\run1979353612\ZkoušeniBlbosti.jar using platform C:\Program Files\Java\jdk1.8.0_72\jre/bin/java
javafx.fxml.LoadException:
file:/D:/Ostatn%c3%ad/Dropbox/Moje%20Java/Zkou%c5%a1eniBlbosti/dist/run1979353612/Zkou%c5%a1eniBlbosti.jar!/zkou%c5%a1eniblbosti/A.fxml:9

        at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
        at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:932)
        at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
        at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
        at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
        at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
        at zkoušeniblbosti.NewClass.vytvorOkno(NewClass.java:23)
        at zkoušeniblbosti.FXMLDocumentController.buttonAction1(FXMLDocumentController.java:31)
        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:1771)
        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:8411)
        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:352)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:388)
        at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387)
        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$148(WinApplication.java:191)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.InstantiationException: zkoušeniblbosti.NewClass
        at java.lang.Class.newInstance(Class.java:427)
        at sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:51)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:927)
        ... 67 more
Caused by: java.lang.NoSuchMethodException: zkoušeniblbosti.NewClass.<init>()
        at java.lang.Class.getConstructor0(Class.java:3082)
        at java.lang.Class.newInstance(Class.java:412)
        ... 69 more
 
Nahoru Odpovědět 6.12.2015 13:43
Avatar
Odpovídá na Petr Kasnal
Petr Štechmüller:

OK, tak jsem Ti poradil špatně, za to se omlouvám. nepodíval jsem se totiž do souboru A.fxml, ve kterém píšeš, že třída NewClass má být kontroler. To ovšem mění situaci, protože když je to kontroler, tak tam musí být bezparametrický konstruktor. Dej mi ještě chvilku, zkusím vymyslet něco jinýho.

Nahoru Odpovědět 6.12.2015 13:57
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Petr Štechmüller
Petr Kasnal:

Jojo v pohodě díky moc že mi pomáháš ;)

 
Nahoru Odpovědět 6.12.2015 14:07
Avatar
Odpovídá na Petr Kasnal
Petr Štechmüller:

Tak už mám řešení. Budu vycházet z toho. co jsem napsal předtím.

1. V souboru A.fxml odeber atribut fx:controller=New­Class, takže bude vypadat takto:

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Button fx:id="button2" layoutX="268.0" layoutY="248.0" mnemonicParsing="false" onAction="#buttonAction2" text="Button" />
      <TextField fx:id="textField" layoutX="207.0" layoutY="101.0" />
   </children>
</AnchorPane>

2. Ve třídě NewClass upravíš metodu vytvorOkno

public void vytvorOkno() {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("A.fxml"));
            fxmlLoader.setController(this); // tento řádek jsem přidal. Tím zajistíš nastavení této třídy jako kontroleru
            Parent root = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.setScene(new Scene(root));
            stage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3. Třída **FXMLDocumen­tController by měla vypadat takto:

public Label label;

    public void buttonAction1() {
        NewClass nc = new NewClass(this); // Toto už jsem psal v příspěvku nahoře...
        nc.vytvorOkno();
    }

   public void setText(String a) {
       label.setText(a);
      // System.out.println(a); Když použiju todle tk to normálně funguje...
   }

Mě to funguje, tak napiš, kdyby jsi měl problémy..

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +2 6.12.2015 14:08
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Petr Štechmüller
Petr Kasnal:

Kámo nejlepší si ! :D Díky moc :)

 
Nahoru Odpovědět 6.12.2015 14:29
Avatar
loading84
Člen
Avatar
loading84:

Mam radost z toho jak se tady pomáhá. Palec nahoru. 8-)

 
Nahoru Odpovědět 6.12.2015 15:16
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.