The propertyChange event is firing before the browser component has loaded; it’s loaded async because it’s such a heavyweight object. You’ll probably have to use invokeLater; there’s no property change event to hook into that will fire once the browser is ready.
if event.propertyName == 'componentRunning':
def addPopupHandler():
from javax.swing import JFrame
from java.awt.event import WindowAdapter
import java.awt.Dimension
from com.teamdev.jxbrowser.chromium.events import DisposeListener
from com.teamdev.jxbrowser.chromium.swing import BrowserView
from com.teamdev.jxbrowser.chromium import PopupContainer, PopupHandler
class MyWindowAdapter(WindowAdapter):
def windowClosing(self, e):
browser.dispose()
class MyDisposeListener(DisposeListener):
def __init__(self, frame):
self.frame = frame
def onDisposed(self, event):
self.frame.setVisible(False)
def invokedLater():
BrowserView.browserView = BrowserView(event.source.browser)
browserView.setPreferredSize(initialBounds.getSize())
frame = JFrame("Popup")
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
frame.add(browserView, BorderLayout.CENTER)
frame.pack()
frame.setLocation(initialBounds.getLocation())
frame.setVisible(True)
#frame.setSize(700,500)
#frame.setPreferredSize(1365, 768)
frame.addWindowListener(MyWindowAdapter())
browser.addDisposeListener(MyDisposeListener(frame))
class MyPopupContainer(PopupContainer):
def insertBrowser(self, browser, initialBounds):
system.gui.invokeLater(invokedLater)
class MyPopupHandler(PopupHandler):
def handlePopup(self, params):
return MyPopupContainer()
event.source.browser.setPopupHandler(MyPopupHandler())
system.util.invokeLater(addPopupHandler, 5000)
Ignition version 8.1.0
I use perspective page via Vision Web Browser (as said before here), so I have a problem with popups at all… they don’t open… when I press the button nothing’s happen…
I pasted Mark Down element to the page and did insert this kind of code to the source property:
The fix is scheduled to go into 8.1.1. for now you could do something like this which borrows from the previous examples. I would recommend waiting for the 8.1.1 fix, but if you need to do some testing now:
if event.propertyName == 'componentRunning':
def addPopupHandler():
from javax.swing import JFrame, WindowConstants
from java.awt.event import WindowAdapter
from java.awt import Dimension, BorderLayout
from com.teamdev.jxbrowser.view.swing import BrowserView
from com.teamdev.jxbrowser.browser.callback import CreatePopupCallback, OpenPopupCallback
from functools import partial
class MyWindowAdapter(WindowAdapter):
def __init__(self, browser):
self.browser = browser
def windowClosing(self, e):
self.browser.close()
def showPopup(browser, initialBounds):
# Initialize our browser view
browserView = BrowserView.newInstance(browser)
browserView.setPreferredSize(Dimension(initialBounds.width(), initialBounds.height()))
# Create a new frame
frame = JFrame("Popup")
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
frame.add(browserView, BorderLayout.CENTER)
frame.pack()
frame.setLocation(initialBounds.x(), initialBounds.y())
frame.setVisible(True)
frame.setMinimumSize(Dimension(1365, 768))
frame.addWindowListener(MyWindowAdapter(browser))
#
# A Callback to allow the creation of a popup
#
class AllowPopupCreation(CreatePopupCallback):
def on(self, params):
return CreatePopupCallback.Response.create()
#
# An OpenPopupCallback which actually performs the opening of the popup
#
class MyPopupHandler(OpenPopupCallback):
def on(self, params):
popupBrowser = params.popupBrowser()
initialBounds = params.initialBounds()
system.util.invokeLater(partial(showPopup, popupBrowser, initialBounds))
return OpenPopupCallback.Response.proceed()
event.source.browser.set(CreatePopupCallback, AllowPopupCreation())
event.source.browser.set(OpenPopupCallback, MyPopupHandler())
system.util.invokeLater(addPopupHandler, 5000)