This feature involves two areas:
On the Windows platform, users may customize their GUIs via
the"Properties" option off the
desktop's popup menu. In order to ensure the Swing Windows Look and Feel
properly implements the user's visual and behavioral preferences,
it must obtain the values of these UI properties from the system
registry. The values for these properties will be retrievable from the
getDesktopProperty()
method on
java.awt.Toolkit.
Most of the properties accessible via this method are specific to the Windows platform and hence have a "win." prefix. The list of supported Windows property names can be obtained programmaticallyby querying the "win.propNames" property:
String propnames[] = (String[])Toolkit.getDefaultToolkit().getDesktopProperty("win.propNames"); System.out.println("Supported windows property names:"); for(int i = 0; i < propnames.length; i++) { System.out.println(propnames[i]); }
Properties which are supported on all platforms begin with an "awt." prefix.
Programs do not need to access these properties directly; the Windows look and feel will automatically read and interpret these properties to provide proper visuals and behavior for the components.
User Preference |
Java Property Name |
Type |
3D Object Background | "win.3d.backgroundColor" | java.awt.Color |
3D Object Highlight | "win.3d.highlightColor" | java.awt.Color |
3D Object Light Highlight | "win.3d.lightColor" | java.awt.Color |
3D Object Shadow | "win.3d.shadowColor" | java.awt.Color |
Active Title Bar color1 | "win.frame.activeCaptionColor" | java.awt.Color |
Active Title Bar color2 | "win.frame.activeCaptionGradientColor"(TBI) | java.awt.Color |
Active Title Bar font color | "win.frame.captionTextColor" | java.awt.Color |
Active Window Border color | "win.frame.activeBorderColor" | java.awt.Color |
Application Background color | "win.mdi.backgroundColor" | java.lang.Color |
Desktop color | "win.desktop.backgroundColor" | java.awt.Color |
Inactive Title Bar color1 | "win.frame.inactiveCaptionColor" | java.awt.Color |
Inactive Title Bar color2 | "win.frame.inactiveCaptionGradientColor"(TBI) | java.awt.Color |
Inactive Title Bar font color | "win.frame.inactiveCaptionTextColor" | java.awt.Color |
Inactive Window Border color | "win.frame.inactiveBorderColor" | java.awt.Color |
Menu color | "win.menu.backgroundColor" | java.awt.Color |
Menu font color | "win.menu.textColor" | java.awt.Color |
Message Box font color | "win.frame.textColor?????" | java.awt.Color |
Selected Items color | "win.item.highlightColor" | java.awt.Color |
Selected Items font color | "win.item.highlightTextColor" | java.awt.Color |
ToolTip color | "win.tooltip.backgroundColor" | java.awt.Color |
ToolTip font color | "win.tooltip.textColor" | java.awt.Color |
Window color | "win.frame.backgroundColor" | java.awt.Color |
Window font color | "win.frame.textColor" | java.awt.Color |
Hot tracking color | "win.item.hotTrackedColor" | java.awt.Color |
User Preference |
Java Property Name |
Type |
Active Title Bar size | "win.frame.captionHeight" | java.lang.Integer |
Active Window Border size | "win.frame.sizingBorderWidth" | java.lang.Integer |
Caption Buttons size | "win.frame.captionButtonHeight" "win.frame.captionButtonWidth" win.frame.captionHeight" |
java.lang.Integer |
Icon size | "win.icon.hspacing" "win.icon.vspacing"??? |
java.lang.Integer |
Icon horizontal spacing | "win.icon.hspacing" | java.lang.Integer |
Icon vertical spacing | "win.icon.vspacing" | java.lang.Integer |
Inactive Title Bar size | "win.frame.captionButtonHeight" "win.frame.captionButtonWidth" "win.frame.captionHeight" |
java.lang.Integer |
Inactive Window Border size | "win.frame.sizingBorderWidth" | java.lang.Integer |
Menu font size | "win.menu.font" "win.menu.height" |
java.lang.Integer |
Menu Size | "win.menu.height" "win.menu.buttonWidth" |
java.awt.Integer |
Palette Title size | "win.frame.smallCaptionHeight" "win.frame.smallCaptionButtonHeight" "win.frame.smallCaptionButtonWidth" |
java.lang.Integer |
Scrollbar width | "win.scrollbar.width" | java.lang.Integer |
Scrollbar height | "win.scrollbar.height" | java.lang.Integer |
Selected Items size | "win.menu.height" "win.menu.buttonWidth" |
java.lang.Integer |
User Preference |
Java Property Name |
Type |
Active Title Bar font | "win.frame.captionFont" | java.awt.Font |
Icon font | "win.icon.font" | java.awt.Font |
Inactive Title Bar font | "win.frame.captionFont" | java.awt.Font |
Menu font | "win.menu.font" | java.awt.Font |
Message Box font | "win.messagebox.font" | java.awt.Font |
Palette Title font | "win.frame.smallCaptionFont" | java.awt.Font |
Selected Items font | "win.menu.font" | java.awt.Font |
ToolTip font | "win.tooltip.font" | java.awt.Font |
Now Swing programs running in the Windows look and feel will render with the system font set by the user instead of a Java-defined font. Since this may cause compatibility problems for programs which depend on the old behavior (because of geometry issues, localization dependencies on particular font glyphs, etc.), a runtime property has been provided to allow this feature to be turned off as necessary:
java -Dswing.useSystemFontSettings=false MyJavaProgram
User Preference |
Java Property Name |
Type |
Icon title wrapping | "win.icon.titleWrappingOn" | java.lang.Boolean |
Window Drag effects | "win.frame.fullWindowDragOn" | java.lang.Boolean |
Keyboard Navigation Display | "win.menu.keyboardCuesOn"(TBI) | java.lang.Boolean |
Hot tracking on toolbars/menubars | "win.item.hotTrackingOn" | java.lang.Boolean |
Title Bar Gradients | "win.frame.captionGradientsOn" | java.lang.Boolean |
User Preference |
Java Property Name |
Type |
Default sound | "win.sound.default" | java.lang.Runnable |
Close sound | "win.sound.close" | java.lang.Runnable |
Maximize sound | "win.sound.maximize" | java.lang.Runnable |
Minimize sound | "win.sound.minimize" | java.lang.Runnable |
Menu Command sound | "win.sound.menuCommand" | java.lang.Runnable |
Menu Popup sound | "win.sound.menuPopup" | java.lang.Runnable |
Open sound | "win.sound.open" | java.lang.Runnable |
Restore Down sound | "win.sound.restoreDown" | java.lang.Runnable |
Restore Up sound | "win.sound.restoreUp" | java.lang.Runnable |
System Asterisk sound | "win.sound.asterisk" | java.lang.Runnable |
System Exclamation sound | "win.sound.exclamation" | java.lang.Runnable |
System Exit sound | "win.sound.exit" | java.lang.Runnable |
System Hand sound | "win.sound.hand" | java.lang.Runnable |
System Question sound | "win.sound.question" | java.lang.Runnable |
System Start sound | "win.sound.start" | java.lang.Runnable |
Note that the object returned for a sound property is simply a
Runnable
that plays the current audio clip for that property.
This means that there is no need for watching for dynamic changes to
sound properties because the sound's property value is a live link
to the current sound setting.
User Preference |
Java Property Name |
Type |
Double click interval | "awt.multiClickInterval" | java.lang.Integer |
Cursor blink rate | "awt.cursorBlinkRate"(TBI) | java.lang.Integer |
In JDK 1.3, AWT added the ability to register
for notification when one of these desktop property values changes. This is
supported via the addPropertyChangeListener()
method on java.awt.Toolkit. Swing's
Windows Look and Feel will use this mechanism to watch for dynamic
property change events on visual properties, and update the GUI by uninstalling
and reinstalling the UI delegates in order for the components to have the most
up-to-date visual property values. This dynamic behavior will automatically
occur for all Swing programs running the Windows look and feel.
This mechanism will update GUI components by traversing the GUI hierarchy
(starting with Frame.getFrames()
and traversing all
windows/containers/components from there). If a client has any
undisplayable components when this occurs (see the isDisplayable()
method on
java.awt.Component
for a definition of when a component is displayable), those components will not
update automatically and it will be the client program's responsibility to
update the UI on those components to ensure their Look and Feel is up-to-date.
For example, this occurs in the SwingSet2 demo because demo panels are created
but not added to the GUI heirarchy until they are selected from the demo's
tabbedpane. Therefore, before the newly selected demo panel is added to the
hierarchy, its UI is updated to ensure it has the most current property
settings:
fragment from SwingSet2.java: // Ensure panel's UI is current before making visible JComponent currentDemoPanel = demo.getDemoPanel(); SwingUtilities.updateComponentTreeUI(currentDemoPanel); // Replace current demo with newly selected demo demoPanel.removeAll(); demoPanel.add(currentDemoPanel, BorderLayout.CENTER);