Diskuze: Prosím o pomoc!
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Petr Štechmüller:6.12.2015 13:15
Čau, z kódu to vypadá, že vůbec nemáš tušení, jak fungují
třídy.
Ty ve třídě FXMLDocumentController 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
FXMLDocumentController. 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 FXMLDocumentController 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...
FXMLDocumentController
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
Petr Kasnal:6.12.2015 13:36
Jenom taková maličkost konstruktor má být bez void Bohužel nefunguje... hodí mi tochybu hned jk zmáčknu button...
Petr Štechmüller:6.12.2015 13:38
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
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
Petr Štechmüller:6.12.2015 13:57
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.
Petr Štechmüller:6.12.2015 14:08
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=NewClass, 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 **FXMLDocumentController 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..
+20 Zkušeností
+2,50 Kč
Mam radost z toho jak se tady pomáhá. Palec nahoru.
Zobrazeno 10 zpráv z 10.