JFormDesigner support

This module allows developers to easily load forms created with JFormDesigner. JFormDesigner is a commercial visual design tool for Swing based user interfaces.

Requirements

For form loading to work, you must have the JFormDesigner form loader library, jfd-loader.jar, in your class path. The Jython book has some instructions on how to accomplish that.

Loading forms

The FormWrapper class and its subclasses, PanelWrapper and WindowWrapper, provide you with the means to load and use your .jfd forms. In typical use cases, you normally want to use either of those subclasses. PanelWrapper is meant to load forms that have a JPanel as their top element, while WindowWrapper is meant for forms with a window as their top element (which includes JFrame, JDialog etc).

Example (loading a JFrame based form):

from swingutils.thirdparty.jformdesigner import WindowWrapper

class MainFrame(WindowWrapper):
    def __init__(self):
        WindowWrapper.__init__(self, 'someform.jfd')

You don’t necessarily have to subclass the wrappers, but it’s often convenient to do so. If you omit the form name, it will determine it from the class name by appending ”.jfd” to its name. If you do this, you’ll obviously have to subclass one of the wrapper classes. The form file is loaded with the standard Java resource loading API, so it can be included in a .jar file.

Note

Don’t define event handlers in your forms, as they will not work with the current Jython version.

Accessing form components

All form components are accessible as attributes of the form wrapper. This was implemented by defining a __getattr__ method that looks up the component name in case an actual attribute is not found by that name.

Getting attribute values from the top level component (Window or Panel) works the same way. If you need to alter the top level component’s attribute values, you can just set them in the hosting instance. If the attribute exists in the top level component, it will be changed there. Otherwise, the hosting class instance will have its attribute set by that name.

If you need a reference to the top level component, you can use the window or panel attributes respectively, depending on which wrapper class is in question.