Certain features, typically ones that have a large impact on Swing,
have been extensively written up in separate documents. The following
link to these documents:
Each section contains changes for a set of related classes. Most
of the sections are focused on the classes that are part of a single
Swing component like JEditorPane or JTable.
Each API change is associated with a link to a report on the
Java Developer Connection (JDC) Bug Parade , where you'll find
the original bug or RFE ("request for enhancement") that motivated
the change. In this document you'll also find the following information
for each API change:
The method signatures with a link to the Javadoc for
new methods or methods
whose semantics have changed.
A brief description of the overall change and how to take advantage
of it. You'll probably find this same material in the evaluation
section of the bug/rfe report.
If the API change corrects a long standing bug or provides
a missing feature - suggestions about how to migrate typical
workarounds or extensions to the new feature.
Nearly all changes (even bugfixes!) introduce some kind of
incompatibility. We've done our best to predict these incompatibilities
and provide advice about how to avoid them.
The bugtraq report that corresponds to this change is:
4304100.
Historically, the superclass for Box has been
Component.
Since Box did not descend from JComponent,
you could not use it like a normal Swing component, for example, you
couldn't set the borders, or issue revalidate.
Not only this, but changing visibility, or other similiar
visual properties, on a standard Swing component typically
triggers a repaint or revalidate,
but Box did not conform to this behavior. As of this
release, Box
and Box.Filler now descend
from the JComponent superclass and therefore behave
more like standard Swing components.
BoxLayout Now Supports Right-to-Left and Bottom-to-Top
Component Orientations
The bugtraq report that corresponds to this change is:
4140833.
BoxLayout did not consider the
ComponentOrientation
of the Container it is laying out. Other AWT layout
managers were made to do this when the
ComponentOrientation
feature was added in JDK 1.2. Adding this feature to
BoxLayout
makes it useful for programs that support Middle East locales.
Because BoxLayout is also used internally by other
Swing components, such as JOptionPane,
JToolBar
and JMenuBar, adding this feature is also necessary
for these components to support
ComponentOrientation.
The bugtraq report that corresponds to this change is:
4659800.
With this bug, introduced in 1.4.0, the default button did
not always follow the focus. This has been fixed in 1.4.1.
New Control of Highlighted Characters
The bugtraq report that corresponds to this change is:
4138746.
AbstractButton and
JLabel
both allow the developer to set a character, called the mnemonic,
that can be used to perform an action when typed at the keyboard.
The javadoc for these methods states that the first
case-insensitive occurrence of the character is decorated.
While this suits most developers,
often times a different occurrence of the character needs to be
highlighted. For example: in Notepad, 'a' is the accelerator for
Save As, but the second 'a' is decorated. Developers need
a way to be able to specify this.
AbstractButton.configurePropertiesFromAction Now Honors
ACTION_COMMAND_KEY Property
The bugtraq report that corresponds to this change is:
4457940.
Previously, the AbstractButton methods
configurePropertiesFromAction(Action)
and
configurePropertiesFromAction(Action, String[])
did not honor the ACTION_COMMAND_KEY property. That has now
been addressed. This affects the javadoc for the
configurePropertiesFromAction methods in the following subclasses of
AbstractButton:
The bugtraq report that corresponds to this change is:
4287690.
Many developers have requested support for listeners to be notified
when a combo box's drop down menu is popped up, dismissed, or canceled.
Applications could use these listeners to lazily populate the combo
box's model with items.
This feature wasn't provided in earlier versions of Swing because
there was some, probably academic, concern about supporting a listener
for a feature (the drop down menu) that some look and feel
implementations might not provide. All of the look and feels
that are shipped with Java, and all of the ones we've come across,
do use a drop down menu to show all of the combo box items.
Some developers have resorted to non-portable hacks to get the
menu state change notifications.
For this release, we added a
PopupMenuListener to
JComboBox. So long as the underlying look and feel
supports an item menu, this listener can be used to perform actions
before and after the combo box menu appears. Several new
JComboBox methods were required to support this feature:
The bugtraq report that corresponds to this change is:
4231298.
JComboBox previously configured a renderer for every
item it displayed. For large lists this could take quite a while.
Instead, developers needed the ability to specify a prototype that
all cells match, so that the prototype is only checked once
instead of every cell. For this release,
getPrototypeDisplayValue and
setPrototypeDisplayValue have been added to
JComboBox.
Javadoc for JComboBox and Related Classes Has
Improved Documentation
The bugtraq report that corresponds to this change is
4394300.
Previously, public API for JComboBox and its UI
delegates contained javadoc which described the details of its
implementation.
Refactoring and bug fixing over the course of its history had
made this javadoc out of date. The javadoc has been checked and
revised so that it describes the behavior of the method rather
than the implementation details. Also, some of the javadoc for
"protected" methods and fields which should really have been private
have been removed so that overriding or calling these methods
are not encouraged.
The bugtraq report that corresponds to this change is
4290709.
Although Swing's JFileChooser closely resembles
the Microsoft Windows common file dialog under the Windows look and feel,
there are several deficiencies for which we have received complaints.
In particular, the Microsoft Windows aesthetics guide mentions
the following:
If you cannot use the [common] Open and Save As dialog boxes,
you should incorporate the following features into your open and
save dialog boxes to ensure that they are consistent with the
shell, the Windows accessories, and other applications:
Support the same namespace hierarchy as the shell; that is,
Desktop should be at the root of the hierarchy, followed by
all folders and objects on the desktop, including My Computer,
My Network, and so on. [...]
Support shortcuts (also known as shell links). [...]
Display filenames with the corresponding icons and filename
extensions removed, as the shell does.
Allow the user to browse the network hierarchy directly.
Make sure that all of your dialog boxes (not just your open
and save dialog boxes) use only nonbold fonts. [...]
The first four points are not possible in Swing without additional
API support from the AWT. The AWT common file dialog is also currently
an unacceptable solution for the following reasons:
It cannot be embedded into a frame or dialog like JFileChooser.
Filename filter is not implemented and is difficult to implement
on Windows.
The new functionality is accomplished by adding
the following public methods to the
javax.swing.filechooser.FileSystemView
class, providing file and directory
information beyond the scope of the File class:
The isTraversable method has been removed from
javax.swing.plaf.basic.BasicFileChooserUI.BasicFileView
so that the superclass's implementation is used.
The bugtraq report that corresponds to this change is
4218431.
Multiple file selection was added to JFileChooser
in the 1.4 release, but the javadoc for
setMultiSelectionEnabled wasn't updated until the 1.4.1 release.
JInternalFrame Now Truncates Titles That are Too Long
The bugtraq report that corresponds to this change is
4134077.
Previously, the title of an internal frame would not be clipped
if it was too long. This would lead to the title displaying over
parts of the icons, as well no visual feedback to the user that
the title had been clipped. To solve this,
BasicInternalFrameTitlePane.getTitle
was added.
JInternalFrame Titles in Windows Look and Feel
May Now be Rendered with a Gradient
The bugtraq report that corresponds to this change is:
4389209.
To implement this correctly, we needed to create a class,
com.sun.java.swing.plaf.windows.WindowsInternalFrameTitlePane,
which extended
javax.swing.plaf.basic.BasicInternalFrameTitlePane,
but overrode the paint routine to render the gradient when appropriate.
The best way to get code-reuse was to break out the portion of
the paint method which paints just the background and override
just that in WindowsInternalFrameTitlePane. The method
paintTitleBackground was added to
javax.swing.plaf.basic.BasicInternalFrameTitlePane.
New Support for Tooltips for Images
in JEditorPane
The bugtraq report that corresponds to this change is:
4252169.
In previous releases it was not possible for
ImageView (the View
responsible for rendering images in a
JEditorPane) to show tooltip text because
there was no way for a View to influence
the tooltip text that is displayed for a
JTextComponent.
In this release, if the the JTextComponent doesn't
have a tooltip, then the view under the mouse is asked to provide
one. If that View corresponds to an HTML element
with an ALT attribute,
then the tooltip text is the value of that attribute.
To make it possible for Views to affect the
tooltip text, a number of methods were needed.
getToolTipText was added to
javax.swing.plaf.TextUI so that it is possible
to get the tooltip text for a particular location.
JTextComponent's
getToolTipText
method then forwards to the TextUI, assuming
a tooltip was not set on the JTextComponent.
getToolTipText was also added to
javax.swing.text.View. The default
implementation of View.getToolTipText will
forward the request to the View's child at
the given location. To make it easy to determine the
child at a particular location,
getViewIndex was added to View.
The View implementation invokes
getViewIndex and then getToolTipText
on the child View.
ImageView then overrides
getToolTipText and returns the value
from the ALT attribute of its AttributeSet.
ImageView Class is Now Public
The bugtraq report that corresponds to this change is:
4233811.
The bugtraq report that corresponds to this change is:
4182124.
The HTML package exposes a way for developers to determine when
the mouse moves over a link via the
HyperlinkEvent and
HyperlinkListener classes. Often times developers
need a way to extract information from the document when the
HyperlinkListener
is notified. There was previously no way for a developer to determine
the position in the document a HyperlinkEvent represents.
To remedy this the constructor
HyperlinkEvent(Object, EventType, URL, String, Element)
and the method
getSourceElement were added to
HyperlinkEvent.
HTMLFrameHyperlinkEvent extends
HyperlinkEvent, which already defines the method
getSourceElement. Since the superclass
now defines this method, the getSourceElement
javadoc was removed from HTMLFrameHyperlinkEvent
(the method is now inherited):
HTML Parser Change: Whitespace Reporting
The bugtraq report that corresponds to this change is:
4241788.
The semantics of the HTML parser
(javax.swing.text.html.parser.Parser)
have slightly changed to better match that of the browser
(NetscapeTM and Internet Explorer).
While no API was changed, those using the parser may notice
a slight difference in the reporting of whitespace. Here is how
things have changed: if strict (an instance variable
of javax.swing.text.html.parser.Parser)
== false (the default) an instance variable is
used to try and mimic the behavior of Netscape and Explorer.
The problematic scenarios are:
'<b>blah <i> <strike> foo'
which can be treated as:
'<b>blah <i><strike>foo'
as well as:
'<p><a href="xx"> <em>Using</em></a></p>'
which appears to be treated as:
'<p><a href="xx"><em>Using</em></a></p>'
When a tag that breaks flow, or trailing whitespace is encountered
an instance variable is set to true. From then on, all whitespace
is ignored. The instance variable is set back to false
the first time a non whitespace character is encountered.
Improved Support for Writing HTML Forms
The bugtraq report that corresponds to this change is:
4200439.
The HTML support provided in the
J2SETM has never correctly supported
writing out form elements. This was due, in large part, to the way
that forms were modeled. To better match the document object
model (see DOM
at www.w3.org) we have changed how
the forms are modeled internally. Previously, any attributes of a
form would be stored in the attributeSet of all of
the children character elements. As of this release,
an element is created to represent
the form, better matching that of the HTML file itself. This allows
for better modeling of the form, as well as consistent writing of
the form.
This affects developers that relied on forms being handled
loosely. As an example, we would previously treat the following
invalid HTML:
<table>
<form>
</table>
</form>
as:
<form>
<table>
</table>
</form>
With this release, we instead treat it as:
<table>
<form>
</form>
</table>
Static DefaultPainter in
javax.swing.text.DefaultHighlighter Class is
Now Final
The bugtraq report that corresponds to this change is:
4328938.
The bugtraq report that corresponds to this change is:
4220001.
Prior to this release, the
PlainDocument(AbstractDocument.Content)
constructor was protected.
This meant that developers wishing to use the constructor had to
subclass. This constructor was intended to be public, and is now
public in this release.
JEditorPane.scrollToReference Method is Now Public
The bugtraq report that corresponds to this change is:
4304676.
JEditorPane.scrollToReference was protected for no
good reason. This method is intended to be useful without having
to subclass, as such it has been made public in this release.
Document.getText Method Now Allows for Partial Returns
The bugtraq report that corresponds to this change is:
4156650.
For efficiently accessing the content of a text document,
Document defines the method
getText(int, int, Segment). Unfortunately,
there has been no way for the caller to determine if the
receiver could efficiently satisfy the request. For example,
GapContent could efficiently implement
the request as long as the request didn't span the
last edited spot of the document (the gap). To facilitate
efficient access of the content, the methods
setPartialReturn and
isPartialReturn have been added to
Segment.
The current semantics of Document.getText still hold,
but for more efficient use callers should invoke
segment.setPartialReturn(true)
and be prepared to get back a portion of the document at a time.
JEditorPane Now Provides HTML Accessibility Support
The bugtraq report that corresponds to this change is:
4303259.
Assistive technologies for people with disabilities require
programmatic access to the contents of
JEditorPane
using the Accessibility API. Previously, the only access was
to hypertext links. This API
change provided accessibility to all HTML components using the
Accessibility API.
Further Support for New AbstractDocument.replace Method
The bugtraq report that corresponds to this change is:
4458513.
As part of
RFE 4431047, a
replace method was added to
AbstractDocument. In order to allow this method
to call remove and
insertString (the only methods defined in the interface
for mutating a Document), the restrictions on when
writeLock may be invoked have been relaxed.
This allows replace to be compatible with old
versions of AbstractDocument that only override
remove and insertString.
The bugtraq report that corresponds to this change is:
4226644.
Prior to this release, if programs wished to display a simple
input dialog containing a textfield with a default string, they
had to invoke the complex JOptionPane.showInputDialog
method which requires seven parameters. Two new methods,
showInputDialog(Object, Object), and
showInputDialog(Component, Object, Object),
make it more convenient to create and display simple input
dialogs.
JOptionPane Now Supports ComponentOrientation
The bugtraq report that corresponds to this change is:
4265463.
The bugtraq report that corresponds to this change is:
4829588.
As of release 1.4.0, JOptionPane is changed
to use non-resizable dialogs. As a result, the dialogs
displayed by many JOptionPane methods have
slightly changed. The first two changes are desirable:
The dialogs are, obviously, no longer resizable.
The dialogs no longer show the system menu icon
(that typically appears in the upper-left corner
of the dialog on a left-to-right system).
A side effect of this change appears in the handling of extra-long
text. Previously, long text was clipped, showing "..." at the end,
as the dialog was restricted to the size of the screen. Now,
extra-long text can cause the dialog to be sized larger than the
screen in order to accomodate all of the text. Keep watching bug
4829588
to see how this undesirable behavior is resolved.
As of this release, showing a JPopupMenu causes
focus to transfer to the parent JRootPane. This was
done so that JPopupMenus would support keyboard
traversal (
4212563). This may cause problems for applications that are
doing validation on focus lost. If this affects you, it is
recommended that in the focusLost notification you
check the temporary property of the FocusEvent and,
if true, do nothing. In situations where you don't
want JPopupMenu to grab focus, there is unfortunately
no way to disable this in the current release. In release 1.4.1 the
decision to transfer focus is based on the focusability of the
JPopupMenu. Refer to bug
4632782 for details.
JPopupMenu Now Supports Key Bindings
The bugtraq report that corresponds to this change is:
4212563.
Previously, JPopupMenu didn't support key bindings. The arrow
keys, mnemonics, the enter key, and escape did not work with a
JPopupMenu unless it was used as part of a compound
component (like a JMenu or a JComboBox).
This behavior can be traced to the fact that JPopupMenu
did not always gain focus, and could therefore not get
KeyEvents.
It was previously not possible for light weight toolkits, such
as Swing, to request focus and indicate that the focus change was
temporary. The new focus architecture solved this problem,
and Swing can now request a temporary focus change. Fixing this
bug required making the JPopupMenu get focus so that
the key bindings can be processed. Consumers that had previously
not expected focus changes need to update their code to check
the temporary property of the
FocusEvents.
JPopupMenu.setVisible(true) Now Throws HeadlessException in Headless Mode
The bugtraq report that corresponds to this change is:
4401222.
When the new headless mode was introduced,
JPopupMenu.setVisible(true) was implemented to throw
NullPointerException when called in headless mode.
It has now been fixed to throw HeadlessException
instead, to indicate that this operation cannot be performed
in headless mode.
The new focus specification states that focus requests on
components that are not showing will fail. This can have subtle
side effects. One such side effect is that requesting focus
from a ChangeListener associated with a
JTabbedPane may fail. At the same time, the
ChangeListener is notified that the component is
not currently visible and therefore the focus request fails
in the same situation that it probably worked under the previous release.
If you are running into this situation with JTabbedPane
it is suggested you make the component visible before requesting focus.
Other situations may require different approaches.
New indexAtLocation Method in JTabbedPane
The bugtraq report that corresponds to this change is:
4241787.
Prior to this change, there was no way for client programs to
convert a coordinate location to a particular tab in a tabbedpane.
This made it difficult to implement special event handling on a
JTabbedPane (like popping up a menu over a tab).
The bugtraq report that corresponds to this change is:
4287053.
The JTabbedPane class is a container that has many
methods which take an integer index as a parameter. Unfortunately,
these methods weren't inconsistent with their approach to throwing
exceptions (some methods check/throw, some don't). Additionally,
the javadoc was in error - it stated that an
IllegalParameterException
was thrown when in fact an ArrayIndexOutOfBoundsException
was thrown (by the underlying Vector).
Any method which takes an index that must be in the valid range
from 0 to tabCount-1 now documents that it throws an
IndexOutOfBoundsException
(note: the underlying code continues to throw
ArrayIndexOutOfBoundsException
for compatibility reasons).
The following doc change:
* @exception IndexOutOfBoundsException if index is out of range
* (index < 0 || index >= tab count)
will be applied to the following
JTabbedPane methods:
The bugtraq report that corresponds to this change is:
4144295.
In JDK 1.3, the moveRow method in
DefaultTableModel
was documented in such a way that it did not clearly define whether
the row at startIndex or the row at endIndex
row would end up at toIndex. By inference from the
examples, it appears that the startIndex should end
up at toIndex when moving rows downward and the
endIndex
should end up at toIndex when moving rows upward.
That said, the implementation of
moveRow had a bug
such that whenever the number of rows being moved was more than
one - the rows would end up in somewhat arbitrary positions and
would not even be contiguous after the move. Bug 4144295 noted that
the implementation did not even perform the example in its specification:
the moveRow(1, 3, 5) example in practice left the vector
in the following state:
a|C|e|B|D|f|g|h|i|j|k
The new implementation makes the observation that this operation is
a simple rotation of elements between bounds that can be calculated
from the inputs.
Since the previous implementation did not work we have taken the
opportunity to simplify the definition to one where the
startIndex
is always moved to the toIndex, with all other elements
appearing after toIndex in the same order that they
were originally. Note that this performs the same operation as the
previous implementation in the only case where it worked - when
a single row was being moved.
The new implementation does not throw an exception when
endIndex
is less than startIndex - it does nothing instead having
satisfied the implied contract to move all rows, r,
where startIndex <= r <= endIndex.
Typing into a JTable Now Transfers Focus to the Cell
The bugtraq report that corresponds to this change is:
4274963.
The Excel application automatically
gives focus to underlying editors when a user presses an alphanumeric
key. We have received over 200 JDC votes requesting that we offer this
behavior in
JTable. While we can't change the default
behavior for reasons of backwards compatibility, in this release
we have added the new property, surrendersFocusOnKeystroke,
to address this request. The new methods
setSurrendersFocusOnKeystroke and
getSurrendersFocusOnKeystrok support this feature.
The default behavior remains unchanged.
DefaultTableModel Now Allows a Null For Name Argument
The bugtraq report that corresponds to this change is:
4474094.
The methods
DefaultTableModel.addColumn(Object)
and DefaultTableModel.addColumn(Object, Vector)
did not previously
allow null for the name argument - they
threw an IllegalArgumentException. As it is possible
to set the column name to null via other means
(using constructors, or directly manipulating the field), the
addColumn methods now also allows a null value.
The bugtraq report that corresponds to this change is:
4264897.
DefaultTreeModel now allows a null root
node . Previously, the javadoc for TreeModel specified
that a null
root was valid, but DefaultTreeModel would
not allow one. DefaultTreeModel now allows setting
a null root, as well as a null root in
the constructor. The javadoc for
setRoot has been revised to reflect the change.
Added First Letter Navigation to JTree
The bugtraq report that corresponds to this change is:
4284709.
Often times users wish to navigate to cells in a JTree
using alphanumeric keys. To facilitate this, a method named
getNextMatch has been added to
JTree.
BasicTreeUI installs a
KeyListener that invokes this method
as keys are typed on the keyboard.
ListDataEvent.toString Now Provides Useful Information
The bugtraq report that corresponds to this change is:
4134085.
Developers often rely on the toString method for
useful debugging information. Unfortunately
ListDataEvent's
toString method did not really provide anything useful.
For this release, it has been changed to return something useful.
JList Now Supports First Letter Key Navigation
The bugtraq report that corresponds to this change is:
4284709.
Often times users wish to navigate to cells in a
JList
using alphanumeric keys. To facilitate this,
getNextMatch was added to JList.
BasicListUI will then install a
KeyListener that will invoke this method as
keys are typed to update the selection.
The bugtraq report that corresponds to this change is:
4759306.
When calling this method the default PreviewPanel was not removed
from the colorChooser, though the new panel was added. This resulted
in strange artifacts. This has been fixed in release 1.4.2.
The bugtraq reports that correspond to this change are:
4419964 and
4668963.
Prior to this release, the DefaultMetalTheme ignored the
font size information from the Windows desktop. As of release 1.4.1,
DefaultMetalTheme can use the font sizes specified in
the Windows desktop. This can be disabled using the system property
swing.useSystemFontSettings. An additional part of this
bug is that our Windows look and feel was picking up the wrong fonts
for a handful of components; this has been fixed.
The bugtraq report that corresponds to this change is:
4615396.
On Microsoft Windows, with the WindowsLookAndFeel,
in certain locales we only honor font size from the desktop.
This has been addressed in 1.4.1.
Document Which Properties a Look and Feel May Ignore
The bugtraq report that corresponds to this change is:
4420209.
Some look and feel implementations may ignore certain properties
which affect the look and feel. With this release, the documentation for
certain methods has been modified to indicate that these properties
may be ignored by some look and feels. Also, the class spec for
UIManager and the documentation for the
javax.swing.plaf.metal package
were modified to specify that the Java look and feel is the default
look and feel. This modification affects only documentation.
The bugtraq report that corresponds to this change is:
4175466.
SwingConstants defines constants that are
used throughout Swing. A common UI operation is to locate the
next/previous item in a sequence; as such,
SwingConstants now defines
constants for
NEXT and
PREVIOUS.
New Way to Process Bindings for Swing Components from
a non-Swing Component
The bugtraq report that corresponds to this change is:
4344900.
Swing has an elaborate infrastructure to support associating actions
with particular key strokes. This means that when the user types
a character the action executes. The processing of these events
is triggered from within
JComponent.processKeyEvent
(processKeyEvent is overridden from
java.awt.Component).
As the processing of these actions occurs within JComponent,
there was previously no way for developers to process bindings from
within non-JComponent subclasses that get focus. To
facilitate this, a
processKeyBindings method was added to
SwingUtilities.
Previously, Swing components did not provide the same auditory
feedback as native components on many platforms. MALF2, a
set of modifications to Swing's PLAFs, is primarily intended for
use as an output-only, non-speech audio user feedback mechanism.
The MALF2 project is important from the perspective of Swing/JFC
and the Java platform's goal of tight user interface integration
with the underlying platform. The MALF2 project ensures that a
user's experience with a native application and a Swing/JFC application
is identical with regard to the auditory user feedback.
The implementation centers around adding API to
BasicLookAndFeel
to support loading an ActionMap containing
Actions that play sounds. Various
BasicComponentUI implementations
then invoke actionPerformed on the Action
at the appropriate time to play the sound.
For example,
BasicMenuItemUI uses
doClick to perform the action.
While BasicLookAndFeel
plays sounds using the Java Sound API, subclasses can use
an alternative
method. For example, WindowsLookAndFeel maps the
Strings to Runnables by way of
Toolkit.getDefaultToolkit().getDesktopProperty(),
to provide integration with the sounds provided by Windows.
The ActionMap containing the sounds can be accessed via
BasicLookAndFeel.getAudioActionMap.
When getAudioActionMap
is first invoked, it performs the following:
The default entry auditoryCues.cueList
(an Object[])
is used to determine a list of sounds to load.
Each entry in the array is passed to createAudioAction
to obtain the Action responsible for playing the
sound.
The Object passed into
BasicLookAndFeel.createAudioAction
is used to look up a path to a sound file from the defaults
table that can be loaded by Java Sound.
When one of the BasicComponentUIs classes wishes
to play a sound, it invokes
BasicLookAndFeel.playSound,
passing in the Action.
BasicLookAndFeel.playSound invokes
actionPerformed
on the Action if the name of the Action
is contained in the defaults entry
AuditoryCues.playList.
This architecture allows the developer numerous ways to customize
the sounds that are played:
The sounds associated with a particular JComponent
can be manipulated by changing the Action in the
ActionMap associated with the JComponent,
eg:
Developers creating a custom look and feel may override
one of the BasicLookAndFeel methods to load the
sounds in an alternative manner, or perhaps play the sounds
in a different way.
Alternatively, the set of sounds to be played can be manipulated
by way of the defaults entry
AuditoryCues.playList.
This Object array contains the keys in the defaults
table indicating which sounds to play. MetalLookAndFeel
defines this to be:
new Object[] {"OptionPane.errorSound",
"OptionPane.informationSound",
"OptionPane.questionSound",
"OptionPane.warningSound" }
This has the effect of turning on only the sounds that
JOptionPane supports.
JMenu Updated to Work with New Focus Architecture
The bugtraq report that corresponds to this change is:
4371580.
The new focus architecture introduced via RFE 4290675
allows for developers to request a temporary focus change. The
request is done through the protected
Component methods
requestFocus(boolean) or
requestFocusInWindow(boolean).
These two methods are protected as they are not meant for general
use, but only for implementors of lightweight toolkits, such as
Swing. Swing is architected in such a way that code in different
packages needs to temporarily request focus; as such, the parent
class of all Swing Components,
JComponent, needs to expose
requestFocus(boolean) and
requestFocusInWindow as public.
New Support for Changing ComponentOrientation in Tree of Components
The bugtraq report that corresponds to this change is:
4337186.
With the bulk of the Swing components paying attention to their
ComponentOrientation property, we now need two
features to make it easier to manage the
ComponentOrientation
settings of an entire hierarchy of components. It should be easy
to set entire hierarchies of components to a consistent
ComponentOrientation setting using the new
SwingUtilities method
applyComponentOrientation(Component c,
ComponentOrientation o).
New Access to Desktop Properties
The bugtraq report that corresponds to this change is:
4290973.
As part of the Windows look and feel update, a method was
added to LookAndFeel,
getDesktopPropertyValue, to
facilitate accessing desktop properties.
New Method to Offset Rectangle by Component's Insets
This was actually added as part of the update to
JProgressBar
to support an indeterminate state. The bugtraq report that corresponds
to this change is:
4290717.
The bugtraq report that corresponds to this change is:
4356268.
Wheel mice, with a scroll wheel as a middle mouse button, are
increasingly popular. This proposal provides for built-in Java
support for scrolling via the mouse wheel, as well as a new wheel
event listener so developers can customize mouse wheel behavior.
JFrame, JDialog, and JApplet No Longer Override processKeyEvent
The bugtraq report that corresponds to this change is:
4462408.
Swing supports the option of registering key bindings on
JComponents. In previous releases it was necessary
for Swing top level components (
JFrame,
JDialog, and
JApplet) to
override processKeyEvent (defined in
java.awt.Component) to activate these
bindings if the focus was ever on one of these
top level components. With the addition of
java.awt.KeyEventPostProcessor
and Swing taking advantage of this
(
RFE 4389332), it is no longer necessary for these
methods to be overridden in the Swing top level components.
As of this release, these methods have been removed at the top
level and are now inherited.
Document Headless Exceptions for JWindow Constructors
The bugtraq report that corresponds to this change is:
4483258.
The bugtraq report that corresponds to this change is:
4532517.
We've recently found an input verifier bug that has been
causing problems for some of our users. Under 1.4, the
shouldYieldFocus method
does not allow side-effects such as popping up an
OptionPane.
We do have the following workaround:
public boolean shouldYieldFocus(JComponent input) {
if (verify(input)) {
return true;
}
// According to the documentation, should yield focus is allowed to cause
// side effects. So temporarily remove the input verifier on the text
// field.
input.setInputVerifier(null);
System.out.println("Removed input verifier");
// Pop up the message dialog.
String message = "Roll over the 'JButton1' with mouse pointer "
+ "after closing this dialog.\nIt sometimes behaves correctly "
+ "for the first time\n but repeating action brings incorrect "
+ "behaviour of button.";
JOptionPane.showMessageDialog(null, message , "invalid value",
JOptionPane.WARNING_MESSAGE);
System.out.println("Showed message.");
// Reinstall the input verifier.
input.setInputVerifier(this);
System.out.println("Reinstalled input verifier");
// Tell whomever called us that we don't want to yield focus.
return false;
}
In certain circumstances showing a heavy weight Window that is not
focusable causes focus to be lost. This specifically happens when running
flavors of Windows and a remote display application, such as
Reflection-X, at the same time. Note that this bug was filed against
release 1.4, but is fixed in 1.4.1. Refer to bug
4628933 for details.
The bugtraq report that corresponds to this change is:
4338458.
The classes in javax.swing.plaf.multi are used to
multiplex between multiple look and feels. This is typically used
by assistive technologies that use an auxiliary look and feel to
provide additional information, such as auditory information. There
is currently no implementation in multi for RootPaneUI
which makes using an auxiliary look and feel problematic.
Support for Look and Feels to Provide Window Decorations
The bugtraq report that corresponds to this change is:
4290471.
AWT recently provided API such that Windows may
be undecorated. That is, when undecorated is true, the
Window will not render
any widgets for closing, moving, or resizing. As such, Swing
has made it possible for the look and feel to render decorations
for Windows.
Not all look and feels support the window
decoration style; the method
getSupportsWindowDecorations
has been added to
javax.swing.LookAndFeel to provide a way
for look and feels to indicate whether they support this
behavior.
This was implemented as part of the mouse wheel support. This
section only documents the changes to JScrollPane,
for details of the other changes refer to this
section.
The bugtraq report that corresponds to this change is: 4356268.
The bugtraq report that corresponds to this change is:
4363288.
The Java 2D team has implemented a new
VolatileImage mechanism
that has the ability to take advantage of hardware acceleration
for Image graphics and blit-to-screen operations.
By default, Swing uses double-buffering to paint the contents of
GUI components (by rendering into an offscreen image and then copying
that image to the screen) and has been changed to take
advantage of the new VolatileImage support.
The double buffer that Swing uses to do painting is obtained from
the RepaintManager by using the method
getOffscreenBuffer.
Since a VolatileImage object requires special handling
(to test for failure conditions), we could not simply change this method
to return a VolatileImage since there may be existing
code out there that invokes this method and does not implement this
additional handling. Therefore, we have added a method,
getVolatileOffscreenBuffer,
to javax.swing.RepaintManager to specifically return
a VolatileImage object.