JavaFX Probleme Beim Wechseln der scene als .fxml

Harry05

Bekanntes Mitglied
Hi Läute,

ich habe ein Standard Javafx erstellt mit .fxml durch Intellij IDE. Habe es dann im Gradle übernommen.
Java:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class Main extends Application{


    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception{


        Parent root = FXMLLoader.load(getClass().getResource("view/ShoppingCartView.fxml"));

    Scene scene = new Scene(root);

        primaryStage.setTitle("Shopping Cart");
                primaryStage.setScene(scene);
                primaryStage.show();
                }

}

Die Main ist ein einstiegst punkt es soll nach MVC Pattern sein.
Die ShoppingCartView.fxml geht auf den Controller ShoppingCartController. Das interagiert auch ganz gut mit sich, die frage wie tausche ich den durch den Controller(ShoppingCartController) die .fxml aus und so weiter?

mir geht's darum das der Controller eine scene
nachschiebe(austauscht) ohne das Fensterrahmen mit dem X neu zu generieren.

Danke im voraus
 
Du kannst dir im Controller die Stage holen und dort eine neue Scene setzen. Der Scene gibst du einfach den Parent der neuen geladenen Fxml Datei mit (FXMLLoader)
 
@Robat Was meinst du mit Stage holen im Controller ?? Ich habe eine Methode was
Java:
public void nextView(){

}

heißt im Controller diese wird durch die View angesprochen, da komme ich nicht weiter. kannst du mir das mal etwas für newbies in java erklären?

wird das eigenlich auch so gemacht im MVC Pattern ?
danke!
 
Kleines Beispiel:
Java:
public class Test extends Application {
    @Override
    public void start( Stage primaryStage ) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("view1.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
Java:
public class View1Controller {

    @FXML
    public void onShowNextPressed(ActionEvent event) {
        Button button = (Button) event.getSource();
        Stage stage = (Stage) button.getScene().getWindow();

        Scene scene = createNextScene();
        stage.setScene(scene);
    }

    private Scene createNextScene() {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("view2.fxml"));
            return new Scene(root);
        } catch ( IOException e ) {
            e.printStackTrace();
        }
        return null;
    }
}
 
@Robat Probleme mit meiner gedachten Logik im Kopf.

die Fxml view findet die Methode warum muss ich ein Event Handler setzen ?? warum geht das nicht durch den Aufruf durch den Button aus der View .fxml? Ich habe eingetrichtert bekommen Programmierer sind faul soooooo wenig code wie Möglich so viel code wie nötig 😀. ich hoffe es verständlich. Aber wenn das erst mal Funkt, Seist du Gesegnet danke.
 
@Robat habe es ausprobiert es funktioniert nicht ich gebe mal alles her.
Java:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class Main extends Application{


    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception{


        Parent root = FXMLLoader.load(getClass().getResource("view/ShoppingCartView.fxml"));

    Scene scene = new Scene(root);

        primaryStage.setTitle("Shopping Cart");
                primaryStage.setScene(scene);
                primaryStage.show();
                }

}

Java:
package controller;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class ShoppingCartController  implements Initializable{

    @FXML
    Button button;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        System.out.println(location.getAuthority());
    }

    @FXML
    public void nextView(ActionEvent event) {
        Button button = (Button) event.getSource();
        Stage stage = (Stage) button.getScene().getWindow();

        Scene scene = createNextScene();
        stage.setScene(scene);
    }

    private Scene createNextScene() {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("view/test.fxml"));
            return new Scene(root);
        } catch ( IOException e ) {
            e.printStackTrace();
        }
        return null;
    }
 
}

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

<?import javafx.scene.Cursor?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Spinner?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="444.0" prefWidth="653.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.ShoppingCartController">
   <children>
      <Button layoutX="47.0" layoutY="15.0" mnemonicParsing="false" prefHeight="153.0" prefWidth="150.0">
         <graphic>
            <ImageView fitHeight="153.0" fitWidth="215.0" pickOnBounds="true" preserveRatio="true">
               <image>
                  <Image url="@../pic/motorcycle.jpeg" />
               </image>
               <cursor>
                  <Cursor fx:constant="DEFAULT" />
               </cursor>
            </ImageView>
         </graphic>
      </Button>
      <Spinner layoutX="48.0" layoutY="181.0" />
      <Label layoutX="49.0" layoutY="16.0" prefHeight="34.0" prefWidth="150.0" text="Costs 15000 € " textFill="WHITE" AnchorPane.leftAnchor="49.0">
         <font>
            <Font size="23.0" />
         </font>
      </Label>
      <Button layoutX="243.0" layoutY="15.0" mnemonicParsing="false" prefHeight="153.0" prefWidth="150.0">
         <graphic>
            <ImageView fitHeight="153.0" fitWidth="575.0" pickOnBounds="true" preserveRatio="true">
               <image>
                  <Image url="@../pic/drums.jpeg" />
               </image>
            </ImageView>
         </graphic>
      </Button>
      <Label layoutX="249.0" layoutY="12.0" prefHeight="34.0" prefWidth="142.0" text="Costs 5000 € " textFill="WHITE">
         <font>
            <Font size="23.0" />
         </font>
      </Label>
      <Spinner layoutX="244.0" layoutY="181.0" />
      <Button layoutX="440.0" layoutY="22.0" mnemonicParsing="false" prefHeight="138.0" prefWidth="150.0" AnchorPane.rightAnchor="51.0">
         <graphic>
            <ImageView fitHeight="150.0" fitWidth="181.0" pickOnBounds="true" preserveRatio="true">
               <image>
                  <Image url="@../pic/ppl-a.jpeg" />
               </image>
            </ImageView>
         </graphic>
      </Button>
      <Spinner layoutX="471.0" layoutY="181.0" />
      <Label layoutX="446.0" layoutY="20.0" prefHeight="34.0" prefWidth="150.0" text="Costs 10000 € " textFill="WHITE" AnchorPane.rightAnchor="57.0">
         <font>
            <Font size="23.0" />
         </font>
      </Label>
      <Button fx:id="button" layoutX="555.0" layoutY="352.0" mnemonicParsing="false" onAction="#nextView" text="Button" />
      <Label fx:id="firstLabel" layoutX="122.0" layoutY="289.0" text="I love bacon" />
      <Label layoutX="125.0" layoutY="344.0" text="Label" />
   </children>
</AnchorPane>

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane 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">
   <children>
      <Button layoutX="233.0" layoutY="200.0" mnemonicParsing="false" text="Button" />
   </children>
</AnchorPane>

Code:
Feb 07, 2019 4:24:10 PM javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 11.0.1 by JavaFX runtime of version 8.0.192
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: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: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: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at controller.ShoppingCartController.createNextScene(ShoppingCartController.java:37)
    at controller.ShoppingCartController.nextView(ShoppingCartController.java:31)
    ... 58 more
 
@Robat es hat gefunkt das ich mit Gradel Arbeiter ist das etwas tiefer alles

Parent root = FXMLLoader.load(getClass().getResource("../view/ShoppingCartView.fxml")); 🙂
 

Neue Themen


Zurück
Oben