# JxBrowser Usage

**URL:** <https://forum.inductiveautomation.com/t/jxbrowser-usage/104729>\
**Category:** Module Development\
**Tags:** perspective\
**Created:** [April 4, 2025, 5:22pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729 "2025-04-04T17:22:44Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [April 4, 2025, 5:22pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729/1 "2025-04-04T17:22:44Z")

</div>

Hopefully this question doesn't require a team of lawyers.

I'd like to use JxBrowser in my module, but when I try to create a JxBrowser engine instance I get the following error:

```python
com.teamdev.jxbrowser.engine.NoLicenseException
	at com.teamdev.jxbrowser.engine.internal.LicenseExceptionFactory.create(LicenseExceptionFactory.java:65)
	at com.teamdev.jxbrowser.engine.internal.EngineImpl.newInstance(EngineImpl.java:268)
	at com.teamdev.jxbrowser.engine.Engine.newInstance(Engine.java:163)
	at ...

```

1. Does IA's JxBrowser license cover usage by module authors?
2. Does the answer to #1 change if my module _requires_ Perspective in order to run?
  - Basically, am I allowed to grab a reference to the designer's existing JxBrowser engine?

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [April 4, 2025, 5:36pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729/2 "2025-04-04T17:36:33Z")

</div>

I would guess no based on [this](https://teamdev.com/jxbrowser/individual-license-agreement/#individual-license-grant), but I don't know the we have a different license agreement or terms.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [April 4, 2025, 6:01pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729/3 "2025-04-04T18:01:09Z")

</div>

What are you ultimately trying to do? I would hazard a guess that referencing an existing JxBrowser instance is probably "more okay" than creating your own, but, uh, disclaimer: I am not a lawyer.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [April 4, 2025, 6:10pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729/4 "2025-04-04T18:10:14Z")

</div>

If you are intending to offer some kind of configuration UI in the designer, you should brush up on your java Swing and implement a `Workspace`.

---

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [April 4, 2025, 6:11pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729/5 "2025-04-04T18:11:41Z")

</div>

> [@paul-griffith](#):
>
> What are you ultimately trying to do?

I'd like to use [Monaco](https://github.com/microsoft/monaco-editor) as an editor for JavaScript resources.

An RSyntaxTextArea will do fine, I was mostly interested in it as an exercise/proof of concept.

> [@pturmel](#):
>
> If you are intending to offer some kind of configuration UI in the designer, you should brush up on your java Swing and implement a `Workspace`.

The current progress:

 ![java_pWxIiRNCRr](https://us1.discourse-cdn.com/inductiveautomation/original/3X/8/0/80382b03540ea71f9dfb0d02593a2411b451d90e.png)

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [April 4, 2025, 6:19pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729/6 "2025-04-04T18:19:46Z")

</div>

🤷  
I am still not a lawyer, but, if you [get a reference to the Perspective `DesignerHook`](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.47/com/inductiveautomation/perspective/designer/DesignerHook.html#get(com.inductiveautomation.ignition.designer.model.DesignerContext)), then get the workspace, it has a [getter for the JxB `Engine`](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.47/com/inductiveautomation/perspective/designer/workspace/ViewWorkspace.html#getEngine())... so you're not creating your own, you're just recycling the one we use.

---

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [April 4, 2025, 6:29pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729/7 "2025-04-04T18:29:32Z")

</div>

Off the thread topic, but while I have your attention, are the new 8.1 script editor improvements public?

[PythonTextAreaEditActionHandler](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.33/com/inductiveautomation/ignition/designer/model/PythonTextAreaEditActionHandler.html) references `com.inductiveautomation.ignition.designer.gui.tools.PythonTextArea`, but there's no JavaDoc page for that class.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [April 4, 2025, 6:31pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729/8 "2025-04-04T18:31:11Z")

</div>

It's written in Kotlin, and our build isn't capable of producing and/or merging KDoc with Javadoc.

It's one of the reasons I rewrote the Device API interfaces back into Java

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [April 4, 2025, 6:55pm UTC](https://forum.inductiveautomation.com/t/jxbrowser-usage/104729/9 "2025-04-04T18:55:39Z")

</div>

This is 8.3, but I think the only API difference is the change to the `scriptHintTree/PackageTreeNode`; in 8.1 you provide a `ScriptHintMap`.

 ![Screenshot 2025-04-04 at 11.51.00 AM](https://us1.discourse-cdn.com/inductiveautomation/original/3X/5/9/59a6468aebec90f3ac030cc805e1fc90e030678f.png)

The only 'gotcha' I remember adding to the documentation is that you should **not** directly modify the Document inside the inner RSTA - always interact with the `text` property.

If you just want to enrich autocomplete with something, go to the completion provider which has some relatively self explanatory methods:

 ![Screenshot 2025-04-04 at 11.54.14 AM](https://us1.discourse-cdn.com/inductiveautomation/original/3X/a/4/a4e832bf37d19a7e06b1ff62f47f5b6d11a030e6.png)

`CompletionDescriptor` is a pretty basic hierarchy of data classes.
