Note: Support for the Servlet API 2.2 has been deprecated in this release and will be removed in the next
release.

Modules, Parts and Release Structure

The ULC release includes all components required to successfully develop and deploy ULC applications. The
ULC modules, parts, packages, and the structure of the current release are described in the following sections.

Modules

The ULC release is split into modules. Each module belongs to exactly one of five categories:

src
Either complete source code or source stubs.
The source stubs are used to enable code completions in IDEs.

webapp
Only for sample modules: ready to deploy web application, i.e. war files

Parts

Each of these modules can contain up to four parts:

Client
Contains classes to be deployed on the client.
Runs inside the sandbox.

Trusted
Contains classes to be deployed on the client.
Does not run inside the sandbox. The needed additional permissions depend on
the module.

Server
Contains classes to be deployed on the server side

Development
Contains all classes needed during development, i.e. the client, trusted,
and server parts plus some additional development classes.

The part names are reflected in the filename of the jar
files in the lib and src directory of the corresponding module, e.g. ulc-applet-client.jar
and ulc-applet-client-src.jar
for the classes and source stubs of the applet module that have to be deployed
on the client side.

Java WebStart VM does not terminate if it once displays a dialog (error, security
dialog, ...)

929

If default close operation is TERMINATE_ON_CLOSE then IApplication.stop() is not
called

931

Using default buttons may lead to warnings on client side

933

ULCFrame.getDefaultCloseOperation() does never return TERMINATE_ON_CLOSE

937

Dialog location is not relativ to parent when dialog.setSize() is used

939

Endless ConcurrentModificationException when working with ULCTree

940

ULCTree does not work with TreeModels that are not based on ITreeNodes

942

Preferred size behaviour of ULCList is wrong

949

Adding a filler to a ULCBoxLayoutPane results in a class cast exception with JRE
1.3

950

Deprecated ULCDialog constructors do not respect passed title and modal
arguments

953

setResizable(false) does not have effect in modal dialogs when called before
setVisible(true)

955

Using default renderers results in a lot of traffic

962

UIStringDataType might throw NullPointerException

970

Using the empty constructor of ULCTable() / ULCTableTree() might result in a memory
leak

972

fireContentsChanged() in a ULCComboBox might result in a IndexOutOfBoundsException on
client side

978

UIEngine hangs sometimes on Linux

979

EJB Clustering is broken

Implemented Feature Requests

PR

Description

Comments

215

Add API pack() to windows

New API:

public void ULCWindow.pack()

ULCWindow.setVisible(true) still invokes
pack() if no explicit window size is set (unlike in Swing). There
is no need to invoke ULCWindow.pack() prior to
ULCWindow.setVisible(true). The ULCWindow.pack()
API is provided to manually re-pack the window after adding/removing components.

374

Add setOpaque to ULCComponents

424

ULCBorderPane.setMargin / ULCBoxPane.setMargin should take Insets

ULCBorderPane and ULCBoxPane.setMargin() is deprecated, please use the new
ULCEmptyBorder API.
See also migration notes

Please have a look at the following classes to get an idea of how these feature can be used:

com.ulcjava.sample.teammembers.client.ResumeLauncher
This is a launcher that displays a basic GUI to start, pause, resume and stop a ULC application.
You can find the complete source code of the ResumeLauncher in the TeamMembers sample module.

com.ulcjava.sample.teammembers.client.TeamMembersResumeLauncher
This is an startable class that uses the ResumeLauncher to start the TeamMembers application.

799

Provide a way to set the margin used by ULCFrame

809

Allow setting of orientation on ULCSeparator

public ULCSeparator(int orientation)

public void setOrientation(int
orientation)

810

Provide ULCToolbar.ULCSeparator, analogous to Swing

New API:

public class ULCToolBar.ULCSeparator

811

Do not disable all contained widgets when a container component is disabled

Affected runtime behaviour:

when a container is disabled, its children are not automatically disabled

814

All container components should inherit from abstract layout pane classes

Provide a way to configure behaviour of ULC widget inside ULCScrollPane

New API:

public void ULCTree.setVisibleRowCount(int)

public int ULCTree.getVisibleRowCount()

public void ULCTable.setPreferredScrollableViewportSize(Dimension)

public Dimension ULCTable.getPreferredScrollableViewportSize()

public void ULCTableTree.setPreferredScrollableViewportSize(Dimension)

public Dimension ULCTableTree.getPreferredScrollableViewportSize()

899

Color should support methods Color.brighter() and Color.darker()

902

Align ULCMenu to swing menus regarding popup

New ULCPopupMenu for menu subcomponents and as a popup menu for all components.
New API:

ULCPopupMenu.add(String)

ULCMenu.getComponentPopupMenu()

ULCComponent.setComponentPopupMenu()

ULCComponent.getComponentPopupMenu()

ULCComponent.setInheritsPopupMenu(boolean)

ULCComponent.getInheritsPopupMenu()

903

container API cleanup

911

ULCStringDataType: do case conversion while typing

914

ULC should not rely on system properties as the SecurityManager controlles access to
them

921

ClientContext should return the clients TimeZone

New API:

ClientContext.getTimeZone()

923

Installer should check for an already installed valid license before asking for a new
one

926

DevelopmentRunner should provide a means to configure the log-level of the
default log manager

Introduced DevelopmentRunner.setLogLevel(Level)

944

Client side representation of ULCFiller should be Box.Filler instead of
an empty JLabel

This change has the following side effect: ULCFiller is now non opaque when setting the background. If
you have used ULCFiller to show a different background then you should use ULCBoxPane with a
corresponding preferred size instead of ULCFiller.

954

DevelopmentRunnerGui should allow to change connection type at runtime

956

ClientContext.getBorder() should return the same border for the same key

958

Server container integration should support custom commands

959

Add support for variable row height lists

960

Add support for variable row height trees

961

A server round trip can be triggered before the system is idle

967

Add pack() to ULCInternalFrame

Migration Notes

ULCScrollPane

Implicit scroll panes around ULCTable, ULCTableTree, ULCTree, ULCList and ULCTextArea
have been removed. Explicitly add these components to a ULCScrollPane, if needed. As an alternative,
use
the init parameter implicit-scrollpane-support for backward
compatibility.

Setting scroll bar policies on a ULCBoxPane is no longer supported. Explicitly add the
ULCBoxPane
to a ULCScrollPane , if needed.

For components, contained in a ULCScrollPane, do not use the setPreferredSize() method.
Use setPreferredSize() on ULCScrollPane instead.

Margins and Alignment

Hard coded margins in several components (e.g. ULCFrame, ULCDialog)
have been removed. This leads to a sub-optimal visual representation as the contained components no longer have
a margin
between themselves and the surrounding container. In order to add a margin, set a ULCEmptyBorder on the
components (see Borders below).

The setting of margins and the setting of alignment has been deprecated in several containers
(ULCRootPane, ULCCardPane, ULCTabbedPane).
Please use the convenience method in BorderedComponentUtilities.createBorderedComponent(component,
alignment, emptyBorder) to set alignment and margin on a
component in one of these containers.

Create a bordered component using BorderedComponentUtilities.createBorderedComponent()with the
following empty border to achieve the same look as in ULC 5.2.1

Default borders for components as defined by LAF on the client can be accessed using ClientContext.getBorder()
API.

Methods isBorderPainted() and setBorderPainted() have been added for
ULCAbstractButton, ULCToolBar, ULCMenuBar, ULCProgressBar and ULCPopupMenu.

Use the BorderFactory to create the borders.

To replace ULCBorderPane create a compound border with an ULCTitledBorder as outer border and
an ULCEmptyBorder as inner border.
The insets of ULCEmptyBorder replace the ULCBorderPane.margin (default value = 5). Set this
border on a box pane.

BorderedComponentUtilities provides a set of convenience methods to ease the migration from the deprecated
ULCBorderPane. With this class you get a
the same result in one line. It automatically sets the margin to 5, the alignemt to IDefaults.BOX_EXPAND_EXPAND and
takes care of the weights:

Note: the look and feel
implementation of many standard Swing components doesn't work well with
user-set borders. Therefore it is recommended to set the component in a
container (e.g. ULCBorderLayoutPane) and set the border on this container.

Opaque

As there is now an explicit setOpaque() API, the implicit binding of the opaque property to
the background property has been removed.
Therefore it is no longer sufficient to only set the background of a component to make this component opaque.

ULC 5.2.1

label.setBackground(Color.red);

ULC 6.0

label.setBackground(Color.red);
label.setOpaque(true);

As a side effect of PR944 a ULCFiller is now always non-opaque when setting the background, i.e. you
cannot use the ULCFiller.setOpaque() API.
If you have used ULCFiller to show a different background then you should use ULCBoxPane with
a corresponding preferred size instead of ULCFiller.

public Object getBasicObject(): Return the object wrapped by the proxy class.

From ULC 6.0, the developers extending UIProxy class are required to override the
createBasicObject(Anything args) method of UIProxy. In this method, the developers are expected to
create and
return the widget object which is supposed to be wrapped by the proxy class. For instance:

The getComponent() method on UIComponent class has been deprecated but retained for backward
compatibility.
Please use getBasicComponent() method instead.

Trusted code

A new package com.ulcjava.base.trusted to contain
trusted code has been introduced.

The classes AllPermissionsBrowserService and
AllPermissionsFileService are now part
com.ulcjava.base.trusted of this package.

Known Problems and Limitations

In a signed applet default cut/copy/paste using [ctrl]+x / [ctrl]+c / [ctrl]+v is
broken. This is a Java Plugin bug not a ULC problem (see Java Bug Database). This
problem only affects Java
Plugin 1.4.2.

After completion of a drag-and-drop operation,
the mouse cursor is not set back to the default cursor. This problem only
occurs on Linux. (PR686)

Inappropriate mouse cursor feedback during drag-and-drop
is observed if the drop target component rejects the drag
operation. This occurs only in pre JRE 1.4.2. (PR756)

Applet deployment does not work for Opera. (PR767)

Product and company names herein may be trademarks of their respective owners.