Tried running code several time but it wont run... Main class is:
package HelloSceneBuilder.src.Application;
import java.io.IOException;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javafx.scene.Parent;
import javafx.scene.Scene;
public class Main extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader loader = new FXMLLoader(Main.class.getClassLoader().getResource("E:/VS CODE/JAVA/HelloSceneBuilder/src/Application/Scene.fxml"));
//Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("E:/VS CODE/JAVA/HelloSceneBuilder/src/Application/Scene.fxml"));
Parent root = loader.load();
//URL url = new FXMLLoader("E:/VS CODE/JAVA/HelloSceneBuilder/src/Application/Scene.fxml").toURI().toURL();
//Parent root = FXMLLoader.load(url);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent arg0) {
Platform.exit();
System.exit(0);
}
});
}
public static void main(String[] args) {
launch(args);
}
}
My controller class is:
package HelloSceneBuilder.src.Application;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.Timer;
import java.util.TimerTask;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.Slider;
import javafx.scene.layout.Pane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.util.Duration;
public class Controller implements Initializable{
@FXML
private Pane pane;
@FXML
private Label songLabel;
@FXML
private Button playButton, pauseButton, resetButton, previousButton, nextButton;
@FXML
private ComboBox<String> speedBox;
@FXML
private Slider volumeSlider;
@FXML
private ProgressBar songProgressBar;
private Media media;
private MediaPlayer mediaPlayer;
private File directory;
private File[] files;
private ArrayList<File> songs;
private int songNumber;
private int[] speeds = {25, 50, 75, 100, 125, 150, 175, 200};
private Timer timer;
private TimerTask task;
private boolean running;
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
songs = new ArrayList<File>();
directory = new File("music");
files = directory.listFiles();
if(files != null) {
for(File file : files) {
songs.add(file);
}
}
media = new Media(songs.get(songNumber).toURI().toString());
mediaPlayer = new MediaPlayer(media);
songLabel.setText(songs.get(songNumber).getName());
for(int i = 0; i < speeds.length; i++) {
speedBox.getItems().add(Integer.toString(speeds[i])+"%");
}
speedBox.setOnAction(this::changeSpeed);
volumeSlider.valueProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
mediaPlayer.setVolume(volumeSlider.getValue() * 0.01);
}
});
songProgressBar.setStyle("-fx-accent: #00FF00;");
}
public void playMedia() {
beginTimer();
changeSpeed(null);
mediaPlayer.setVolume(volumeSlider.getValue() * 0.01);
mediaPlayer.play();
}
public void pauseMedia() {
cancelTimer();
mediaPlayer.pause();
}
public void resetMedia() {
songProgressBar.setProgress(0);
mediaPlayer.seek(Duration.seconds(0));
}
public void previousMedia() {
if(songNumber > 0) {
songNumber--;
mediaPlayer.stop();
if(running) {
cancelTimer();
}
media = new Media(songs.get(songNumber).toURI().toString());
mediaPlayer = new MediaPlayer(media);
songLabel.setText(songs.get(songNumber).getName());
playMedia();
}
else {
songNumber = songs.size() - 1;
mediaPlayer.stop();
if(running) {
cancelTimer();
}
media = new Media(songs.get(songNumber).toURI().toString());
mediaPlayer = new MediaPlayer(media);
songLabel.setText(songs.get(songNumber).getName());
playMedia();
}
}
public void nextMedia() {
if(songNumber < songs.size() - 1) {
songNumber++;
mediaPlayer.stop();
if(running) {
cancelTimer();
}
media = new Media(songs.get(songNumber).toURI().toString());
mediaPlayer = new MediaPlayer(media);
songLabel.setText(songs.get(songNumber).getName());
playMedia();
}
else {
songNumber = 0;
mediaPlayer.stop();
media = new Media(songs.get(songNumber).toURI().toString());
mediaPlayer = new MediaPlayer(media);
songLabel.setText(songs.get(songNumber).getName());
playMedia();
}
}
public void changeSpeed(ActionEvent event) {
if(speedBox.getValue() == null) {
mediaPlayer.setRate(1);
}
else {
//mediaPlayer.setRate(Integer.parseInt(speedBox.getValue()) * 0.01);
mediaPlayer.setRate(Integer.parseInt(speedBox.getValue().substring(0, speedBox.getValue().length() - 1)) * 0.01);
}
}
public void beginTimer() {
timer = new Timer();
task = new TimerTask() {
public void run() {
running = true;
double current = mediaPlayer.getCurrentTime().toSeconds();
double end = media.getDuration().toSeconds();
songProgressBar.setProgress(current/end);
if(current/end == 1) {
cancelTimer();
}
}
};
timer.scheduleAtFixedRate(task, 0, 1000);
}
public void cancelTimer() {
running = false;
timer.cancel();
}
}
my fxml file is:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ProgressBar?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="165.0" prefWidth="654.0" style="-fx-background-color: #222222;" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">
<children>
<Label fx:id="songLabel" alignment="CENTER" layoutX="-1.0" prefHeight="100.0" prefWidth="655.0" text="MP3 Player" textFill="#00ff1a">
<font>
<Font size="65.0" />
</font>
</Label>
<ProgressBar fx:id="songProgressBar" layoutX="-1.0" layoutY="99.0" prefHeight="18.0" prefWidth="655.0" progress="0.0" />
<Button fx:id="playButton" layoutY="117.0" mnemonicParsing="false" onAction="#playMedia" prefHeight="46.0" prefWidth="85.0" text="PLAY">
<font>
<Font size="18.0" />
</font>
</Button>
<Button fx:id="pauseButton" layoutX="85.0" layoutY="117.0" mnemonicParsing="false" onAction="#pauseMedia" prefHeight="46.0" prefWidth="85.0" text="PAUSE">
<font>
<Font size="18.0" />
</font>
</Button>
<Button fx:id="resetButton" layoutX="170.0" layoutY="117.0" mnemonicParsing="false" onAction="#resetMedia" prefHeight="46.0" prefWidth="85.0" text="RESET">
<font>
<Font size="18.0" />
</font>
</Button>
<Button fx:id="previousButton" layoutX="255.0" layoutY="117.0" mnemonicParsing="false" onAction="#previousMedia" prefHeight="46.0" prefWidth="85.0" text="PREVIOUS">
<font>
<Font size="13.0" />
</font>
</Button>
<Button fx:id="nextButton" layoutX="340.0" layoutY="117.0" mnemonicParsing="false" onAction="#nextMedia" prefHeight="46.0" prefWidth="85.0" text="NEXT">
<font>
<Font size="13.0" />
</font>
</Button>
<ComboBox fx:id="speedBox" layoutX="425.0" layoutY="117.0" onAction="#changeSpeed" prefHeight="46.0" prefWidth="79.0" promptText="SPEED" />
<Slider fx:id="volumeSlider" layoutX="504.0" layoutY="133.0" max="100.0" prefHeight="14.0" prefWidth="149.0" value="50.0" />
</children>
</AnchorPane>
package application;
The error i am receiving:
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:566)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
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:566)
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:901)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.IllegalStateException: Location is not set.
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2541)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2516)
at HelloSceneBuilder.src.Application.Main.start(Main.java:21)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
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:184)
... 1 more
Exception running application HelloSceneBuilder.src.Application.Main
I tried many soln but didn't work... I also tried changing path of FXML file but no success... I tried to run a simple helloworld program for javafx and it was working, but i am getting many errors while running this... Also i am new to JAVAFX and this is my second project in it... and I use VS CODE... Thanks in advance...