Stephen Day
Stephen Day

Reputation: 21

Can't start a Processing sketch window unless it's in the same file as main(String[] args)

I'm working in a project in IntelliJ with the Processing library imported. I have two files, StartUpGUI.java, and Renderer.java.
If I ignore the first file and put this in Renderer.java, the sketch runs perfectly.

public class Renderer extends PApplet {
...
     public static void main(String[] args) {
          PApplet.main(new String[] {Renderer.class.getName()});
     }
...
}

But if I try to put the main() in the StartUpGUI.java file and have it call the constructor of the other, I get an error.
StartUpGUI.java

public class StartUpGUI {
     public static void main(String[] args) {
          Renderer renderer = new Renderer();
     }
}

Renderer.java

public class Renderer extends PApplet {
...
     public Renderer() {
          PApplet.main(new String[] {Renderer.class.getName()});
     }
...
}

Error

reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at processing.core.PApplet.runSketch(PApplet.java:10277)
    at processing.core.PApplet.main(PApplet.java:10091)
    at field.renderer.Renderer.<init>(Renderer.java:17)
    at jdk.internal.reflect.GeneratedConstructorAccessor1.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at processing.core.PApplet.runSketch(PApplet.java:10277)
    at processing.core.PApplet.main(PApplet.java:10091)
    at field.renderer.Renderer.<init>(Renderer.java:17)
    ...
(The error is absurdly long)
    ...
    at processing.core.PApplet.main(PApplet.java:10091)
Caused by: java.lang.reflect.InvocationTargetException
    at jdk.internal.reflect.GeneratedConstructorAccessor1.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at processing.core.PApplet.runSketch(PApplet.java:10277)
    at processing.core.PApplet.main(PApplet.java:10091)
    at field.renderer.Renderer.<init>(Renderer.java:17)
    at jdk.internal.reflect.GeneratedConstructorAccessor1.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at processing.core.PApplet.runSketch(PApplet.java:10277)
    at processing.core.PApplet.main(PApplet.java:10091)
    at field.renderer.Renderer.<init>(Renderer.java:17)
    ...

I don't know if that error is helpful at all, I just hope there's a couple lines in there that can tell someone what's going on. I don't understand it.

One thing I tried was changing the the constructor of Renderer.java to say PApplet.main(new String[] {StartUpGUI.class.getName()}); instead but it just gave the error:

java.lang.ClassCastException: class field.renderer.StartUpGUI cannot be cast to class processing.core.PApplet (field.renderer.StartUpGUI and processing.core.PApplet are in unnamed module of loader 'app')
    at processing.core.PApplet.runSketch(PApplet.java:10277)
    at processing.core.PApplet.main(PApplet.java:10091)
    at field.renderer.Renderer.<init>(Renderer.java:17)
    at field.renderer.StartUpGUI.main(StartUpGUI.java:11)

So, if anyone knows how to start a Processing sketch from outside the main file, I'd really appreciate help. Thanks in advance.

Also, I'm new to asking questions on Stack Overflow, so sorry if I did anything wrong.

Upvotes: 1

Views: 132

Answers (1)

Stephen Day
Stephen Day

Reputation: 21

I figured it out. I guess it just needed to be in a static context.

Renderer.java

public static void main(String[] args) {
    PApplet.main(new String[] {Renderer.class.getName()});
}

StartUpGUI.java

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

Upvotes: 1

Related Questions