This feature involves two areas:
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 programmatically by 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 |
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 |
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 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, it's 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);