How can I import a layout from another package in JavaFX? - java

Here is the code:
package application;
//imports
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import application.view.*; //i've tried import the package, but i don't know if this is correct
public class Main extends Application {
#Override
public void start(Stage primaryStage) {
try {
//here is my issue:
**Pane root = FXMLLoader.load(getClass().getResource("application.view.Lay.fxml"));**
Scene scene = new Scene(root,400,400);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
}
I've Tried this, but it doesn't work, what am I doing wrong?
Thanks for your time!

Try
Pane root = FXMLLoader.load(getClass().getResource("/application/view/Lay.fxml"));

If we have a lengthy package name, we have to replace every dot "." with forward slash.
Like if package name that contain views/fxml files is
package org.itsoftsolutions.view;
Than we have to provide path like this
FXMLLoader.load(getClass().getResource("/org/itsoftsolutions/view/login.fxml"));

Related

How to switch the root from controllers without resizing the window in JavaFX?

(James_D has showed me the solution. I'll just elaborate on how it helped me and what I did at the end of this question. Hopefully others find it useful.)
My wrong initial approach:
There are several FXML files and their controllers in my program. I loaded the FXML files and changed the scenes. It caused the window size to change when it was maximized.
Then this answer showed that I should change the root instead.
Current approach and question:
I tried the code given in the answer there and it works flawlessly. First I set a root in the start method and switched to anther root after a time delay. It's just to check. It looks like this:
package com;
import java.io.IOException;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Launcher extends Application {
public static void main(String[] args) {
launch(args);
}
#Override
public void start(Stage stage) throws Exception {
StackPane root = FXMLLoader.load(getClass().getResource("/com/Scene2.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setMaximized(true);
stage.show();
Timeline timeline2 = new Timeline(new KeyFrame(Duration.millis(1000), e2 -> {
try {
StackPane root2 = FXMLLoader.load(getClass().getResource("/com/Scene1.fxml"));
scene.setRoot(root2);
} catch (IOException e1) {
e1.printStackTrace();
}
}));
timeline2.play();
}
}
In my actual program the start method loads an FXML file. Later I click buttons or something on the screen which should change the root. So I'll have to use a similar code in controllers. But to set the root, I need to get the scene. In the start method the scene is already created and available. I can't figure out how to get that in a controller. So I tried creating a new scene in the controller. But it's not working. It doesn't throw exceptions or anything. The program simply doesn't do anything when I press the button. This is the relevent code in the controller.
public void changeRoot(ActionEvent event) throws IOException {
try {
Parent root2 = FXMLLoader.load(getClass().getResource("/com/Scene2.fxml"));
// I added the line below.
Scene scene = new Scene(root2);
scene.setRoot(root2);
} catch (IOException e1) {
e1.printStackTrace();
}
}
The solution:
Right then. As you can see from the comment below, I can get the scene by calling getScene() on any node in the current scene. In my example code I have a button on the current screen. A button is a node. So I use it to get the scene. I'll just share the code of the controller class so you know what I mean.
package com;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
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.scene.layout.StackPane;
import javafx.stage.Stage;
public class Scene1Controller implements Initializable {
#FXML
private Button button;
#Override
public void initialize(URL location, ResourceBundle resources) {
}
public void changeRoot(ActionEvent event) throws IOException {
try {
Parent root2 = FXMLLoader.load(getClass().getResource("/com/Scene2.fxml"));
button.getScene().setRoot(root2); // Here I get the scene using the button and set the root.
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
Now there's something you should keep in mind. You have to make sure you give an fx:id for the node in FXML. It should match the given variable name of the node in the controller. For example, in my controller I have a Button. I've named it 'button'. I've also made sure the id for the Button in the FXML file is 'button'. It's very easy to set the fx:id. I used the Gluon Scene Builder. (Sometimes the changes I make there doesn't get updated in Eclipse right away. Refreshing the project makes sure the changes are updated in Eclipse too.)

Beginner; GUI not appearing?

I'm new to java and coding. I tried searching this problem but could not find a solution.
I was given this code as an example on paper. I tried to recreate it in Eclipse but when I run the code, nothing happens (no gui popup or anything like that). It wouldn't work in jGrasp either. Anyone know what is wrong?
Thanks
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
import javafx.scene.media.AudioClip;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
public class AudioShuffle extends Application {
private AudioClip audio1;
private AudioClip audio2;
private AudioClip audio3;
private AudioClip audio4;
private Button play, stop, shuffle;
#Override
public void start(Stage primaryStage) {
String clipURL = "http://www.music.helsinki.fi/tmt/opetus/uusmedia/esim/a2002011001-e02-16kHz.wav";
audio1 = new AudioClip(clipURL);
play=new Button("PLAY");
play.setStyle("-fx-font:20 Arial");
stop=new Button("STOP");
stop.setStyle("-fx-font:20 Arial");
play.setOnAction(this::processButtonPress);
stop.setOnAction(this::processButtonPress);
FlowPane pane = new FlowPane(play, stop);
pane.setAlignment(Pos.CENTER);
pane.setHgap(20);
pane.setStyle("=fx=background=color: cyan");
Scene scene = new Scene(pane, 300,100);
primaryStage.setTitle("Audio Playlist");
primaryStage.setScene(scene);
primaryStage.show();
}
public void processButtonPress(ActionEvent event){
if(event.getSource()==play){
audio1.play();
}
else if(event.getSource()==stop){
audio1.stop();
}
}
public static void main(String[] args){
}
}

JavaFX multiple line

When i tried to compile code it have bug. I am trying to resolve problem one hour and i don't know this bug. Do you know how to fix it? Thanks!
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public abstract class Mainn extends Application
{
public static void main(String[] args){launch(args);
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(this.getClass.getResource("/fxml/StackPaneWindow.fxml"));
StackPane stackPane = loader.load();
Scene scene = new Scene (stackPane);
primaryStage.setScene(scene);
primaryStage.setTitle("bang");
primaryStage.show();
}
}
}
The first problem I see with this is that the method start(Stage) is inside your main function, which isn't allowed java. Close your main function before defining another function.

FXMLLoader.load can't be resolved to a type

So I created a FXML interface using JavaFX's Scene Builder tool, and I'm trying to load it via my code. However, I ran into this error when trying to load my FXML document: FXMLLoader.load can't be resolved to a type.
Here is my code:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Driver extends Application {
public static void main(String[] args) {
launch(args);
}
#Override
public void start(Stage primaryStage) {
Parent root = new FXMLLoader.load(getClass().getResource("interface.fxml"));
Scene scene = new Scene(root, 600, 400);
primaryStage.setTitle("Wiki Scraper");
primaryStage.setScene(scene);
primaryStage.show();
}
}
My FXML document is contained in the most top level project folder.
What am I doing incorrectly?
Try to split it up this way:
FXMLLoader loader = new FXMLLoader(this.getClass().getResource("DefaultFrame.fxml"));
Parent root = (Parent) loader.load();
dfController = loader.getController();

Getting Errors parsing FXML file into a javafx program

Im Getting These Errors when trying to parse this FXML file into my Java Program.The code for when i load in the FXML file and where i get the errors are bellow
package mediarealm;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class MediaRealm extends Application {
#Override
public void start(Stage primaryStage) {
Parent root = null;
primaryStage.initStyle(StageStyle.UNDECORATED);
try {
root = FXMLLoader.load(getClass().getResource("/rsrc /UIManagmentDefaultState.fxml"));
} catch (IOException ex) {
Logger.getLogger(MediaRealm.class.getName()).log(Level.SEVERE, null, ex);
}
root.setStyle("-fx-background-color: #000000;");
Scene scene = new Scene(root, 1280, 720);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
It could possibly because of the code Bellow but I don't think it is i'm trying to load in some of the elements from the fxml file into the rest of my code so that i can have full access to said elements with java.
package mediarealm;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
public class Controller
{
#FXML private Button ExitButton;
#FXML private static Button myVideos;
public static void doshit()
{
myVideos.setText("Addison is gay!");
}
Probably a long shot, but the line
< fx:id="myMusic" /Button>
is no correct XML, it rather should be
</Button>

Categories

Resources