JavaFX FXML file not opening error chosen file should be valid FXML but it is working for other FXML files

Viewed 84

I am working on image editor using JavaFX FXML ,scene builder 2.0 .I am getting this error continuously where my scene builder doesn't read FXML file when double clicking on it. I haven't used an other other libraries or anything and have tried opening particular FXML from scene builder directly as well. I have tried using possible solutions on this question but non seems to work for me. enter image description here

 package imageeditor;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.SnapshotParameters;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.effect.ColorAdjust;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.stage.FileChooser;
import javax.imageio.ImageIO;
import imageeditor.CommandCenter;
import javafx.scene.control.ColorPicker;

public class FXMLDocumentController implements Initializable {
//    @FXML
//    private Edit Images = new Edit();
//    @FXML
//     private ImageView ImageView,i ;
//     @FXML private ImageView mImageView;
    @FXML
    private AnchorPane mAnchorPane;
    @FXML    
     private ImageView mImageView;
    @FXML 
    private Button btnUndo;
    @FXML 
    private Button btnRedo;
    @FXML 
    private Button exit;
    @FXML
    private Button reset;
    @FXML
    private Button uploadbtn,savebtn;
    @FXML
    private Label l1,l2,l3,l4,l5,l6,l7; 
    @FXML 
    private Slider bright;
    @FXML 
    private Slider gauss;
    @FXML 
    private Slider hue;
    @FXML
    private Slider saturation;
    @FXML 
    private Slider contrast;
    @FXML
    private Button cropbtn  ;
     @FXML
    private Button stickersbtn  ;
    @FXML
    private Button  textbtn ;
//    @FXML
//    private Button   ;
    @FXML
    private ColorPicker framecolour  ;
 
    private ColorAdjust AdjustEffect = new ColorAdjust();
    // CommandCenter  CommandCenter= new CommandCenter();
   
    @FXML
    private void LoadImage(ActionEvent event) {
            FileChooser fileChooser = new FileChooser();            
            FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
            FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
            fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);

            File file = fileChooser.showOpenDialog(null);                       
            try 
            {
                BufferedImage bufferedImage = ImageIO.read(file);
                Image image = SwingFXUtils.toFXImage(bufferedImage, null);
               
                 mImageView.setImage(image);
                 Image currentImage = getSnapshot();
                 CommandCenter.getInstance().setImageAndView(currentImage);
                 CommandCenter.getInstance().setOriginalImage(currentImage);  
                  
//              CommandCenter.getInstance().setImageView(mImageView);
//              CommandCenter.getInstance().setOriginalImage(image);
                
            } catch (IOException ex) {

            }      
    }
    @FXML
    private void SaveImage(ActionEvent event) {
            
            FileChooser fileChooser = new FileChooser();
            fileChooser.setTitle("Save Image");
            FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG");
            FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
            fileChooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);
                 
                File file = fileChooser.showSaveDialog(null);
                if (file != null) {
                    try {
                        BufferedImage bImage = SwingFXUtils.fromFXImage(mImageView.snapshot(null, null), null);
                        ImageIO.write(bImage,"png", file);
                    } catch (IOException ex) {
                    }
                }
          }    
//@FXML void quit(ActionEvent event) {
//        System.exit(0);
//    }

    @FXML void undo(ActionEvent event) {
       undo();
    }

    @FXML void redo(ActionEvent event) {
        redo();
    }
       // save image as snapshot
        private Image getSnapshot() {
          SnapshotParameters snapshotParameters = new SnapshotParameters();
          snapshotParameters.setViewport(mImageView.getViewport());
  //            snapshotParameters.setViewport(new Rectangle2D(mImageView.getX(), mImageView.getY(), mImageView.getImage().getWidth(), mImageView.getImage().getHeight()));
          return mAnchorPane.snapshot(snapshotParameters, null);
      }
    
    private void undo() {
        if (CommandCenter.getInstance().hasUndoImage()) {
            Image currentImage = getSnapshot();
            CommandCenter.getInstance().addRedoImage(currentImage);
            Image undoImage = CommandCenter.getInstance().getUndoImage();
            resetEffectsSliders();
            CommandCenter.getInstance().setImageAndView(undoImage);
            mImageView.setImage(undoImage);
            enableRedo();
            if (!CommandCenter.getInstance().hasUndoImage()) {
                disableUndo();
            }
        }
    }

    // redo action
    private void redo() {
        System.out.println("redo image added");
        if (CommandCenter.getInstance().hasRedoImage()) {
            Image currentImage = getSnapshot();
            CommandCenter.getInstance().addUndoImage(currentImage);
            Image redoImage = CommandCenter.getInstance().getRedoImage();
            resetEffectsSliders();
            CommandCenter.getInstance().setImageAndView(redoImage);
            mImageView.setImage(redoImage);
            enableUndo();
            if (!CommandCenter.getInstance().hasRedoImage()) {
                disableRedo();
            }
        }
    } 
     // update the image and associated properties
    private void updateImageAndProperties() {
        CommandCenter.getInstance().storeLastImageAsUndo();
        CommandCenter.getInstance().clearRedoImages();  // new "path" so clear redo images
        disableRedo();
        enableUndo();
        Image currentImage = getSnapshot();
        CommandCenter.getInstance().setImageAndView(currentImage);
        resetEffectsSliders();
        mImageView.setImage(currentImage);

    }

    // start over with original image
    private void startOver() {
        resetEffectsSliders();
        Image originalImage = CommandCenter.getInstance().getOriginalImage();
        CommandCenter.getInstance().setImageAndView(originalImage);
        mImageView.setImage(originalImage);
        CommandCenter.getInstance().clearRedoImages();
        CommandCenter.getInstance().clearUndoImages();
        disableUndo();
        disableRedo();
    }
     private void resetEffectsSliders() {
        bright.setValue(0);
        contrast.setValue(0.0);
        hue.setValue(0.0);
        saturation.setValue(0.0);
    
        
    }
     // enable undo buttons
    private void enableUndo() {
        btnUndo.setDisable(false);
    }

    // disable undo buttons
    private void disableUndo() {
        btnUndo.setDisable(true);
    }

    // enable redo buttons
    private void enableRedo() {
        btnRedo.setDisable(false);
    }

    // disable redo buttons
    private void disableRedo() {
        btnRedo.setDisable(true);
    }

    // enable start over buttons
    private void enableStartOver() {
        reset.setDisable(false);
    }

    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
     CommandCenter.getInstance().setImageView(mImageView);
//        Images.GaussSliderEvent(gauss);
//        Images.BrightSliderEvent(bright);
//        Images.SaturationSliderEvent(saturation);
//        Images.HueSliderEvent(hue);
//        Images.ContrastSliderEvent(contrast);
     
         mImageView.setEffect(AdjustEffect);               
     
     // take a snapshot to set as initial image
     Image initialImage = getSnapshot();
     mImageView.setImage(initialImage);
     CommandCenter.getInstance().setImageView(mImageView);
     CommandCenter.getInstance().setOriginalImage(initialImage);
     CommandCenter.getInstance().setImageAndView(initialImage);

      // brightness slider 
        bright.valueProperty().addListener((observable, oldValue, newValue) -> {
            AdjustEffect.setBrightness(newValue.doubleValue());
            mImageView.setEffect(AdjustEffect);
             updateImageAndProperties();
           
             }); 
      
      // hue slider
        hue.valueProperty().addListener((observable, oldValue, newValue) -> {
            AdjustEffect.setHue(newValue.doubleValue());
             mImageView.setEffect(AdjustEffect);
             updateImageAndProperties();

        });
      
      // saturation slider 
        saturation.valueProperty().addListener((observable, oldValue, newValue) -> {
            AdjustEffect.setSaturation(newValue.doubleValue());
              //Image.setEffect(AdjustEffect);
               updateImageAndProperties();

        });
    
      //  contrast slider
        contrast.valueProperty().addListener((observable, oldValue, newValue) -> {
            AdjustEffect.setContrast(newValue.doubleValue());
             // Image.setEffect(AdjustEffect);
               updateImageAndProperties();
        });
    



     // gauss slider
        gauss.valueProperty().addListener((observable, oldValue, newValue) -> {
//            gauss.setRadius(newValue.doubleValue()*100);
//           Image.setEffect(gauss);
             updateImageAndProperties();
               
                 

        });
    }

     


    
}

Java FXML file is

  <?xml version="1.0" encoding="UTF-8"?>
        
        <?import javafx.scene.effect.*?>
        <?import javafx.scene.text.*?>
        <?import javafx.scene.image.*?>
        <?import java.lang.*?>
        <?import java.util.*?>
        <?import javafx.scene.*?>
        <?import javafx.scene.control.*?>
        <?import javafx.scene.layout.*?>
        
        <AnchorPane id="AnchorPane" prefHeight="650.0" prefWidth="1150.0" style="-fx-background-color: #FFFFF0;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="imageeditor.FXMLDocumentController">
            <children>
                <Button fx:id="uploadbtn" layoutX="797.0" layoutY="24.0" onAction="#LoadImage" opacity="0.75" style="-fx-background-color: #800000;" text="UPLOAD IMAGE" textFill="WHITE">
                 <font>
                    <Font name="Bell MT Bold" size="18.0" />
                 </font></Button>
              <ImageView fx:id="ImageView" fitHeight="639.0" fitWidth="927.0" layoutX="201.0" layoutY="94.0" pickOnBounds="true" preserveRatio="true">
                 <image>
                    <Image url="@BG.jpg" />
                 </image></ImageView>
              <Button fx:id="savebtn" layoutX="1007.0" layoutY="23.0" mnemonicParsing="false" onAction="#SaveImage" opacity="0.75" prefHeight="34.0" prefWidth="105.0" style="-fx-background-color: #800000;" text="SAVE" textFill="WHITE">
                 <font>
                    <Font name="Bell MT Bold" size="18.0" />
                 </font></Button>
              <Button fx:id="resetbtn" layoutX="54.0" layoutY="576.0" text="RESET" />
              <Button fx:id="undobtn" layoutX="25.0" layoutY="94.0" mnemonicParsing="false" style="-fx-background-color: #800000;" text="UNDO" textFill="WHITE" />
              <Button fx:id="redobtn" layoutX="115.0" layoutY="94.0" mnemonicParsing="false" style="-fx-background-color: #800000;" textFill="WHITE"text="REDO" />
              <Button fx:id="cropbtn" layoutX="63.0" layoutY="143.0" mnemonicParsing="false" text="CROP" />
              <ColorPicker fx:id="framecolour" layoutX="52.0" layoutY="414.0" />
              <Button fx:id="stickersbtn" layoutX="24.0" layoutY="516.0" mnemonicParsing="false" text="ADD  STICKERS" />
              <Button fx:id="textbtn" layoutX="44.0" layoutY="470.0" mnemonicParsing="false" text="ADD TEXT" />
         
              <Slider fx:id="gauss" blockIncrement="0.1" layoutX="42.0" layoutY="315.0" max="1.0" min="0" />
              <Slider fx:id="contrast" blockIncrement="0.01" layoutX="42.0" layoutY="237.0" max="1.0" min="-1.0" />
              <Slider fx:id="hue" blockIncrement="0.01" layoutX="42.0" layoutY="199.0" max="1.0" min="-1.0" />
              <Slider fx:id="saturation" blockIncrement="0.01" layoutX="42.0" layoutY="277.0" max="1.0" min="-1.0" />
              <Slider fx:id="bright" blockIncrement="0.01" layoutX="38.0" layoutY="355.0" max="1.0" min="-1.0" />
              <Slider fx:id="frame" blockIncrement="0.01" layoutX="42.0" layoutY="393.0" max="1.0" min="-1.0" />
            
              <ImageView fitHeight="63.0" fitWidth="91.0" layoutX="31.0" layoutY="13.0" pickOnBounds="true" preserveRatio="true">
                 <image>
                    <Image url="@logo.png" />
                 </image>
              </ImageView>
              <Label fx:id="l1" layoutX="140.0" layoutY="18.0" prefHeight="51.0" prefWidth="451.0" text="IMAGE EDITOR AND ENHANCER" textFill="#830c0c">
                 <font>
                    <Font name="Artifakt Element Black Italic" size="29.0" />
                 </font>
              </Label>
              <Label fx:id="l2" layoutX="81.0" layoutY="182.0" text="hue" />
              <Label fx:id="l3" layoutX="76.0" layoutY="220.0" text="contrast" />
              <Label fx:id="l4" layoutX="68.0" layoutY="258.0" text="saturation" />
              <Label fx:id="l5" layoutX="76.0" layoutY="298.0" text="gauss" />
              <Label fx:id="l6" layoutX="74.0" layoutY="331.0" text="brightness" />
              <Label fx:id="l7" layoutX="74.0" layoutY="376.0" text="frame" />
                
                
                
                
            </children>
        </AnchorPane>
1 Answers

SceneBuilder bring a stacktrace if you press show details button

show details scenebuilder

Details :

java.io.IOException: org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 149; Element type "Button" must be followed by either attribute specifications, ">" or "/>".
    at com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueLoader.load(GlueLoader.java:93)
    at com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueLoader.load(GlueLoader.java:76)
    at com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueDocument.<init>(GlueDocument.java:54)
    at com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument.<init>(FXOMDocument.java:84)
    at com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument.<init>(FXOMDocument.java:108)
    at com.oracle.javafx.scenebuilder.kit.editor.EditorController.updateFxomDocument(EditorController.java:2560)
    at com.oracle.javafx.scenebuilder.kit.editor.EditorController.setFxmlTextAndLocation(EditorController.java:763)
    at com.oracle.javafx.scenebuilder.app.DocumentWindowController.loadFromFile(DocumentWindowController.java:389)
    at com.oracle.javafx.scenebuilder.app.SceneBuilderApp.performOpenFiles(SceneBuilderApp.java:668)
    at com.oracle.javafx.scenebuilder.app.SceneBuilderApp$1.invalidated(SceneBuilderApp.java:520)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(Unknown Source)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(Unknown Source)
    at javafx.base/javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(Unknown Source)
    at javafx.base/javafx.beans.property.ReadOnlyBooleanWrapper.fireValueChangedEvent(Unknown Source)
    at javafx.base/javafx.beans.property.BooleanPropertyBase.markInvalid(Unknown Source)
    at javafx.base/javafx.beans.property.BooleanPropertyBase.set(Unknown Source)
    at com.oracle.javafx.scenebuilder.kit.library.user.UserLibrary.lambda$updateFirstExplorationCompleted$7(UserLibrary.java:371)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)
    at java.base/java.security.AccessController.doPrivileged(Unknown Source)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(Unknown Source)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)
Caused by: org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 149; Element type "Button" must be followed by either attribute specifications, ">" or "/>".
    at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.seekCloseOfStartTag(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueLoader.load(GlueLoader.java:91)
    ... 23 more

java.io.IOException: org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 149;

Line 28:

<Button fx:id="redobtn" layoutX="115.0" layoutY="94.0" mnemonicParsing="false" style="-fx-background-color: #800000;" textFill="WHITE"text="REDO" />

Error: there is no space in between textFill and text attributes , so Compiler can't read properly button tag

fix line 28 :

<Button fx:id="redobtn" layoutX="115.0" layoutY="94.0" mnemonicParsing="false" style="-fx-background-color: #800000;" textFill="WHITE" text="REDO" />

Now scenebuilder can open that file

scenebuilder

Related