• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JavaFX jak załadować Tab w fxml w TabPane w fxml.

Object Storage Arubacloud
0 głosów
360 wizyt
pytanie zadane 16 września 2018 w Java przez ILikeJava Obywatel (1,230 p.)
edycja 16 września 2018 przez ILikeJava

Witam mam problem z wyjątkiem java.lang.reflect.InvocationTargetException w JavaFX. Niestety post nie zmieścił się tutaj bo miał powyżej 15k znaków więc link do posta tutaj (poprawione).

Z góry wielkie dzięki za pomoc bo ten błąd mnie przerasta.

komentarz 16 września 2018 przez mbabane Szeryf (79,280 p.)

Nie działa link, wstaw kod w bloki code ikona {....}

komentarz 16 września 2018 przez ILikeJava Obywatel (1,230 p.)
Już poprawione. Trochę było kopiowania i wkleiłem nie to co trzeba.
komentarz 16 września 2018 przez mbabane Szeryf (79,280 p.)
pokaż jeszcze EmailTabController
komentarz 16 września 2018 przez ILikeJava Obywatel (1,230 p.)

Tam jeszcze nic nie ma, najpierw chcę aby to się w ogóle wyświetlało, a później będę robił jakieś funkcjonalności.

 


package res.mainWindow.emailTab;

public class EmailTabController
{

}

1 odpowiedź

+1 głos
odpowiedź 16 września 2018 przez mbabane Szeryf (79,280 p.)
wybrane 17 września 2018 przez ILikeJava
 
Najlepsza

Ok chyba wszystko jasne. 

Problemem jest to że do dwóch widoków masz przypisany ten sam kontroler tzn. do createEmailWindow i do MainWindow. To powoduje że w momencie kiedy klikasz finish odwołujesz się do instancji MainController należącej do createEmailWindow, a tam nie ma tabPane co skutkuje że jest on nullem w metodzie finish.

Żeby to rozwiązać najlepiej będzie, według mnie, zrobić całkiem osobny kontroler do createEmailWindow i nie przypisywać go w fxml tylko przypisać go podczas tworzenia w metodzie openCreateEmail w taki sposób:

class EmailCreatorController
{
     //kontorlki JavaFX ktore są w craeteEmailWindow z adnotacjami FXML

     private MainController mainController;

     public EmailCreatorController(MainController mainController)
     {
                 this.mainController = mainController;
     }


    public void finishButtonCliced()
   {
          TabPane tabPane = mainController.getTabPane();
          FXMLLoader loader = new FXMLLoader( "emailtab.fxml");
            Tab tab = loader.load();
         tabPane.getTabs().add(tab);
    }
 }

I teraz MainController:

class MainController
{
        //kontorlki javaFX w mainWindow.fxml;

        @FXML 
        private TabPane tabPane;
      
        //inne metody
 
       public void openCreateEmail()  
      {
             FXMLLoader loader = new FXMLLoader( "createEmailWindow.fxml");

             loader.setController( new EmailCreatorController( this ); 

             //reszta bez zmian
      }

      public TabPane getTabPane()
      {  
            return tabPane;
      }
}

Dzięki powyższemu w obiekcie EmailCreatorController masz dostęp do właściwego obiektu TabPane. (pamietaj żeby w createEmailWindow.fxml usunąć atrybut fx:controller).

komentarz 17 września 2018 przez ILikeJava Obywatel (1,230 p.)

Nie działa ładowanie Taba. Wszędzie dokładnie sprawdziłem dopisałem w kilku miejscach @FXML ale dalej jest błąd:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
	at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1787)
	at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1670)
	at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
	at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
	at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8863)
	at javafx.controls/javafx.scene.control.Button.fire(Button.java:200)
	at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:206)
	at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
	at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
	at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
	at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
	at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
	at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3876)
	at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1300(Scene.java:3604)
	at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1874)
	at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2613)
	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
	at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
	at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
	at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
	at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
	at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76)
	at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:275)
	at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83)
	at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1784)
	... 47 more
Caused by: java.lang.IllegalStateException: Location is not set.
	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2459)
	at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
	at res.mainWindow.emailCreator.EmailCreatorController.finishButtonClicked(EmailCreatorController.java:45)
	... 58 more

Nie ogarniam co jest źle. Taki sam kawałek kodu działa w jednym miejscu a w innym już nie (mam na myśli kod ładujący fxmle). Ścieżkę do pliku dobrą podałem.

komentarz 17 września 2018 przez mbabane Szeryf (79,280 p.)
Pokaz kod EmailCreatorController oraz fxml tego co próbujesz załadować (eamilTab tak?), po naniesionych zmianach.
komentarz 17 września 2018 przez ILikeJava Obywatel (1,230 p.)

EmailCreatorController:

package res.mainWindow.emailCreator;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
import res.mainWindow.emailTab.EmailTabController;
import res.mainWindow.mainWindow.MainController;

public class EmailCreatorController
{
    //kontorlki JavaFX ktore są w craeteEmailWindow z adnotacjami FXML

    private MainController mainController;

    @FXML
    private Button helpButton;

    @FXML
    private Button cancelButton;

    @FXML
    private Button finishButton;

    @FXML
    private TextField nameTextField;

    @FXML
    private TextField pathTextField;

    public EmailCreatorController(MainController mainController)
    {
        this.mainController = mainController;
    }

    @FXML
    public void finishButtonClicked() throws Exception
    {
        TabPane tabPane = mainController.getTabPane();
        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("res/mainWindow/emailTab/emailTab.fxml"));
        Tab tab = loader.load();
        tabPane.getTabs().add(tab);
    }

    @FXML
    public void cancelButtonClicked(MouseEvent mouseEvent)
    {
        Stage stage = (Stage) cancelButton.getScene().getWindow();
        stage.close();
    }

    @FXML
    public void helpButtonClicked(MouseEvent mouseEvent)
    {

    }
}

 

emailTab.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.web.HTMLEditor?>

<Tab text="Untitled Tab" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" >
    <AnchorPane>
        <children>
            <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity">
                <children>
                    <Label layoutX="10.0" layoutY="15.0" text="From:" />
                    <Label layoutX="10.0" layoutY="80.0" text="To:" />
                    <Label layoutX="10.0" layoutY="145.0" text="Topic:" />
                    <TextField layoutX="10.0" layoutY="40.0" prefHeight="25.0" prefWidth="380.0" />
                    <TextField layoutX="10.0" layoutY="105.0" prefHeight="25.0" prefWidth="380.0" />
                    <TextField layoutX="10.0" layoutY="170.0" prefHeight="25.0" prefWidth="380.0" />
                    <HTMLEditor htmlText="&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body contenteditable=&quot;true&quot;&gt;&lt;/body&gt;&lt;/html&gt;" layoutX="10.0" layoutY="225.0" prefHeight="420.0" prefWidth="965.0" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="210.0" />
                </children>
            </AnchorPane>
        </children>
    </AnchorPane>
</Tab>

 

komentarz 17 września 2018 przez mbabane Szeryf (79,280 p.)
 FXMLLoader loader = new FXMLLoader(this.getClass().getResource("res/mainWindow/emailTab/emailTab.fxml"));

Ścieżka musi się zaczynać od znaku /

I prawdopodobnie będzie Ci sie sapać o tego html'a.

komentarz 17 września 2018 przez ILikeJava Obywatel (1,230 p.)

I kurcze sapało ciągle o ten jeden ukośnik. sad Wszystko śmiga. Dzięki wielkie za pomoc. wink

Podobne pytania

0 głosów
1 odpowiedź 119 wizyt
pytanie zadane 1 listopada 2018 w Java przez ILikeJava Obywatel (1,230 p.)
0 głosów
1 odpowiedź 472 wizyt
pytanie zadane 18 czerwca 2020 w Java przez Akiro Bywalec (2,910 p.)
0 głosów
0 odpowiedzi 399 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...