Prosty program - zmienianie zawartości stackPane

0

Witam, niezbyt ogarniam jeszcze te errory w Javie więc prosiłbym o pomoc bo nie mam pomysłu - chyba robię tak jak na poradnikach ale no wywala errora :/

sample.Main

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader fxmlLoader = new FXMLLoader(this.getClass().getResource("sample/sample.fxml"));
        StackPane stackPane = fxmlLoader.load();
        Scene scene = new Scene(stackPane,400,400);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Jakis programek xD");
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

sample.MainController

package sample;
import javafx.application.Application;
import randomGenerator.*;

import javafx.fxml.FXML;
import javafx.scene.layout.Pane;

public class MainController {

    @FXML
    Pane contentPane;
    RandomGenerator randomGenerator = new RandomGenerator();

    public void loadContent(Pane pane){
        contentPane.getChildren().clear();
        contentPane.getChildren().add(pane);
    }
    @FXML
    private void openRandomGenerator(){
    loadContent(randomGenerator.getPane());
    }
    @FXML
    private void openPhotoViewer(){

    }
    @FXML
    private void openCalculator(){

    }
    @FXML
    private void exit(){

    }
}

sample.sample.fxml

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>

<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.MainController">
   <children>
      <VBox prefHeight="200.0" prefWidth="100.0">
         <children>
            <ButtonBar nodeOrientation="LEFT_TO_RIGHT" prefHeight="40.0" prefWidth="602.0">
              <buttons>
                  <Button mnemonicParsing="false" onAction="#openRandomGenerator" text="random" />
                  <Button mnemonicParsing="false" onAction="#openPhotoViewer" text="photoViewer" />
                  <Button mnemonicParsing="false" onAction="#openCalculator" text="calculator" />
                  <Button mnemonicParsing="false" onAction="#exit" text="exit" />
              </buttons>
               <padding>
                  <Insets right="10.0" />
               </padding>
            </ButtonBar>
            <Pane fx:id="contentPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="373.0" prefWidth="602.0" />
         </children>
      </VBox>
   </children>
</StackPane>

i w razie czego daje też generator ale tam chyba jest dobrze wszystko (jeszcze nie skończony)

package randomGenerator;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.Pane;

import java.io.IOException;

public class RandomGenerator {

    Pane pane;
    public RandomGenerator(){
        FXMLLoader fxmlLoader = new FXMLLoader(this.getClass().getResource("randomGenerator/randomGenerator.fxml"));
        try {
            pane =  fxmlLoader.load();
        }
        catch (IOException e) {
        e.printStackTrace();
        }
    }
    public Pane getPane(){
        return pane;
    }
}

0

A oto zestaw errorów:

"C:\Program Files\Java\jdk-12.0.1\bin\java.exe" "-javaagent:C:\Users\Mateusz\AppData\Local\JetBrains\IntelliJ IDEA Community Edition 2019.1.3\lib\idea_rt.jar=13815:C:\Users\Mateusz\AppData\Local\JetBrains\IntelliJ IDEA Community Edition 2019.1.3\bin" -Dfile.encoding=UTF-8 -p "C:\Program Files\Java\javafx-sdk-12.0.1\lib\javafx-swt.jar;C:\Program Files\Java\javafx-sdk-12.0.1\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-12.0.1\lib\javafx.controls.jar;C:\Program Files\Java\javafx-sdk-12.0.1\lib\javafx.fxml.jar;C:\Program Files\Java\javafx-sdk-12.0.1\lib\javafx.graphics.jar;C:\Program Files\Java\javafx-sdk-12.0.1\lib\javafx.media.jar;C:\Program Files\Java\javafx-sdk-12.0.1\lib\javafx.swing.jar;C:\Program Files\Java\javafx-sdk-12.0.1\lib\javafx.web.jar;C:\Users\Mateusz\IdeaProjects\test\out\production\test" -m test/sample.Main
Exception in Application start method
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:567)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
	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:567)
	at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:835)
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 test/sample.Main.start(Main.java:17)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	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:174)
	... 1 more
Exception running application sample.Main

Process finished with exit code 1
1
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 test/sample.Main.start(Main.java:17)
16 -->        FXMLLoader fxmlLoader = new FXMLLoader(this.getClass().getResource("sample/sample.fxml"));
17 -->        StackPane stackPane = fxmlLoader.load();

Gdzie trzymasz ten podfolder sample? Piszesz w Javie 8 z wbudowanym JavaFX czy w np Javie 11 i ciągniesz JavaFX jako maven dependency?
Upewnij się że ścieżki są dobrze ustawione. Pliki FXML powinny być w katalogu resources luib w jego podkatalogach - do getResource podajesz ścieżkę względną od resources, może też brakować slasha na początku ścieżki (takie sugestie się pojawiają na SO).

0
superdurszlak napisał(a):
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 test/sample.Main.start(Main.java:17)
16 -->        FXMLLoader fxmlLoader = new FXMLLoader(this.getClass().getResource("sample/sample.fxml"));
17 -->        StackPane stackPane = fxmlLoader.load();

Gdzie trzymasz ten podfolder sample? Piszesz w Javie 8 z wbudowanym JavaFX czy w np Javie 11 i ciągniesz JavaFX jako maven dependency?
Upewnij się że ścieżki są dobrze ustawione. Pliki FXML powinny być w katalogu resources luib w jego podkatalogach - do getResource podajesz ścieżkę względną od resources, może też brakować slasha na początku ścieżki (takie sugestie się pojawiają na SO).

Ymmm to tak, nie ogarniam serio zbytnio, dopiero przeskoczyłem do tej Javy z C++ to tylko ogarnąłem poradnik jak ustawić to wszystko to mam Jave 12 jako JavaFX chyba ale bez mavena. To źle? Pliki to nwm ja to wszystko przez InteliIJ układałem czyli tworzyłem plik w kreatorze. To muszę to poprzenosić jakoś? Mam normalnie package jako folder w eksploratorze plikow a w folderze normalnie same pliki .java i .fxml bez zadnych resoursow czy cos.

1
Xezolpl napisał(a):

Jave 12 jako JavaFX chyba ale bez mavena. To źle?

JavaFX wycięli z corowej Javy w wersji 10 albo 11, już nawet nie pamiętam. Żeby używać tego co teraz nazywa się JavaFX masz do wyboru JavaFX SDK albo maven dependency zaciągany do projektu. Taka dygresja.

I nie "chyba" tylko się upewnij czego właściwie używasz, to trochę słabe nie wiedzieć z czym ma się do czynienia bo prędzej czy później wyniknie z tego jakaś bieda :D

Pliki to nwm ja to wszystko przez InteliIJ układałem czyli tworzyłem plik w kreatorze.

No ale chyba jesteś w stanie podejrzeć drzewo katalogów projektu w IntelliJ? o.O

To muszę to poprzenosić jakoś? Mam normalnie package jako folder w eksploratorze plikow a w folderze normalnie same pliki .java i .fxml bez zadnych resoursow czy cos.

Utwórz katalog resources obok katalogu sample, przenieś tam plik sample.fxml i popraw ścieżkę w getResource na "sample.fxml". Powinieneś mieć coś w ten deseń:

\- src
    \- main
        \- java
            \- jakis_package
                \- Main.java 
        \- resources
            \- sample.fxml
1

Ymmm to tak, nie ogarniam serio zbytnio, dopiero przeskoczyłem do tej Javy z C++ to tylko ogarnąłem poradnik jak ustawić to wszystko to mam Jave 12 jako JavaFX chyba ale bez mavena. To źle? Pliki to nwm ja to wszystko przez InteliIJ układałem czyli tworzyłem plik w kreatorze. To muszę to poprzenosić jakoś? Mam normalnie package jako folder w eksploratorze plikow a w folderze normalnie same pliki .java i .fxml bez zadnych resoursow czy cos.

Według mnie jak chcesz się bawić z JavaFX to lepiej jak na razie wrócić do JDK 8 w której FX się zawiera. Zwłaszcza że jest łatwiej skonfigurować środowisko a JDK 11 nie wprowadza jakiś spektakularnych ficzerów, no chyba że podzielasz HDD. Jak będziesz miał JDK8 to projekt "postaw na mavenie", on Ci wymusi strukturę katalogów projektu i odpadnie Ci konieczność babrania się z pytanie: "gdzie umieścić FXMLa". Pliki .java i .fxml trzyma się w dwóch różnych lokalizacjach. Poza tym o przykłady będzie łatwiej jak wpiszesz w Google: maven + javafx.

0

Ok super, poprzestawiałem w tym projekcie zgodnie ze wskazówkami, został jeden error i nie mam pojęcia skąd się wziął bo robiłem projekt Javowski przecież na samym JavaFX bez kotlina a tu

Error:Kotlin: The Kotlin standard library is not found in the module graph. Please ensure you have the 'requires kotlin.stdlib' clause in your module definition

EDIT
Ale po przebudowaniu jak odpalam main to i tak to samo, w sensie nie znajduje tej sciezki chyba i sie wysypuje na metodzie FXMLLoader.load() także nwm, no podałem relative path do fxmla i niby wszystko tak jak wyżej ale nic to nie dało

Exception in Application start method
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:567)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
	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:567)
	at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:835)
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 test/main.java.sample.Main.start(Main.java:13)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	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:174)
	... 1 more
Exception running application main.java.sample.Main
1

Ok super, poprzestawiałem w tym projekcie zgodnie ze wskazówkami, został jeden error i nie mam pojęcia skąd się wziął bo robiłem projekt Javowski przecież na samym JavaFX bez kotlina a tu

Error The Kotlin standard library is not found in the module graph. Please ensure you have the 'requires kotlin.stdlib' clause in your module definition

Wygląda na to że czasami IntelliJ dostaje kuku: IntelliJ Support

Wg. tego co pisali w wątku na Stacku, tym podlinkowaniem wyżej, czasami problem rozwiązuje dołożenie backslasha na początku ścieżki. Próbowałeś? Jak w ogóle wygląda teraz struktura plików a jaką ścieżkę podajesz do getResource?

1 użytkowników online, w tym zalogowanych: 0, gości: 1