public class JRootPane extends JComponent implements Accessible
JFrame
, JDialog
, JWindow
, JApplet
和JInternalFrame
。
有关根窗格提供的功能的面向任务的信息,请参阅Java教程中的 How to Use Root Panes 。
以下图像显示了使用根窗格的类之间的关系。
“重量级”组件(委托给对等体或主机系统上的本机组件)的组件显示为较暗,较重的组件。 四个重量级JFC / Swing容器(JFrame
, JDialog
, JWindow
和JApplet
)被示出相对于它们扩展AWT类。
这四个组件是Swing库中唯一重量级的容器。
还示出了轻型容器JInternalFrame
。
所有这五个JFC / Swing容器都实现了RootPaneContainer
接口,他们都将其操作委托给一个JRootPane
(顶部有一个“句柄”)。
Note: TheJComponent
methodgetRootPane
can be used to obtain theJRootPane
that contains a given component.
JRootPane
。
A JRootpane
由glassPane
,可选的menuBar
和contentPane
。
( JLayeredPane
管理menuBar
和contentPane
) glassPane
位于所有的顶部,它可以拦截鼠标移动。
由于glassPane
(如contentPane
)可以是任意组件,也可以设置glassPane
进行绘图。
然后, glassPane
上的线条和图像可以在下面的框架之上,而不受其边界的限制。
虽然menuBar
组件是可选的,在layeredPane
, contentPane
和glassPane
始终存在。 尝试将其设置为null
会生成异常。
要将组件添加到JRootPane
(可选菜单栏除外),您将对象添加到contentPane
的JRootPane
,如下所示:
rootPane.getContentPane().add(child);
设置布局管理器,删除组件,列出子项等同样的原则。所有这些方法都在contentPane
而不是在JRootPane
上JRootPane
。
Note: The default layout manager for the如果在contentPane
is aBorderLayout
manager. However, theJRootPane
uses a customLayoutManager
. So, when you want to change the layout manager for the components you added to aJRootPane
, be sure to use code like this:rootPane.getContentPane().setLayout(new BoxLayout());
JMenuBar
上设置了JRootPane
,则它将沿着框架的上边缘定位。
contentPane
的位置和大小进行了调整,以填补剩余的面积。
( JMenuBar
和contentPane
被添加到layeredPane
组件在JLayeredPane.FRAME_CONTENT_LAYER
层。)
该layeredPane
是在所有儿童的家长JRootPane
-既是菜单的直接父和所有组件的祖父加入到contentPane
。 它是一个JLayeredPane
的实例,它提供了在多个层中添加组件的功能。 使用菜单弹出窗口,对话框和拖动时,此功能非常有用,您需要将组件放置在窗格中所有其他组件的顶部。
glassPane
位于JRootPane中所有其他组件的JRootPane
。 这提供了一个方便的地方来绘制所有其他组件,并且可以拦截鼠标事件,这对拖动和绘图都是有用的。 开发人员可以使用setVisible
在glassPane
时控制glassPane
显示比其他孩子。 默认情况下, glassPane
不可见。
自定义LayoutManager
所用JRootPane
确保:
glassPane
填写JRootPane
(边界 - 插图)的整个可见区域。 layeredPane
充满整个可视区域JRootPane
。 (边界 - 插图) menuBar
位于的上边缘layeredPane
。 contentPane
填写整个可见区域,减去menuBar
(如果存在)。 JRootPane
视图层次结构中的任何其他视图将被忽略。
如果您更换LayoutManager
的JRootPane
,那么您有责任管理所有这些视图。 所以通常你会想确保你更改contentPane
而不是JRootPane
本身的布局管理器!
Swing的绘画架构需要一个不透明的JComponent
存在于所有其他组件之上的包含层次结构中。 这通常通过内容窗格提供。 如果更换内容窗格,建议你做内容窗格不透明的方式setOpaque(true)
。 另外,如果内容窗格覆盖paintComponent
,则需要在paintComponent中完全填充不透明颜色的paintComponent
。
警告: Swing不是线程安全的。 有关更多信息,请参阅Swing's Threading Policy 。
警告:此类的序列化对象与将来的Swing版本不兼容。 当前的序列化支持适用于运行相同版本的Swing的应用程序之间的短期存储或RMI。 从1.4开始,对所有JavaBeans的长期存储的支持已被添加到java.beans
包中。 请参阅XMLEncoder
。
JLayeredPane
, JMenuBar
, JWindow
, JFrame
, JDialog
, JApplet
, JInternalFrame
, JComponent
, BoxLayout
, Mixing Heavy and Light Components
Modifier and Type | Class and Description |
---|---|
protected class |
JRootPane.AccessibleJRootPane
这个类实现了可访问性支持
JRootPane 类。
|
protected class |
JRootPane.RootLayout
一个自定义布局管理器,负责分层面,玻璃面和菜单栏的布局。
|
JComponent.AccessibleJComponent
Container.AccessibleAWTContainer
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
Modifier and Type | Field and Description |
---|---|
static int |
COLOR_CHOOSER_DIALOG
用于windowDecorationStyle属性的常量。
|
protected Container |
contentPane
内容窗格。
|
protected JButton |
defaultButton
当窗格具有焦点并且出现特定于UI的操作(如按
Enter键)时,该按钮将被激活。
|
protected javax.swing.JRootPane.DefaultAction |
defaultPressAction
已弃用
从Java 2平台v1.3开始。
|
protected javax.swing.JRootPane.DefaultAction |
defaultReleaseAction
已弃用
从Java 2平台v1.3开始。
|
static int |
ERROR_DIALOG
用于windowDecorationStyle属性的常量。
|
static int |
FILE_CHOOSER_DIALOG
用于windowDecorationStyle属性的常量。
|
static int |
FRAME
用于windowDecorationStyle属性的常量。
|
protected Component |
glassPane
玻璃窗格覆盖菜单栏和内容窗格,因此可以拦截鼠标移动等。
|
static int |
INFORMATION_DIALOG
用于windowDecorationStyle属性的常量。
|
protected JLayeredPane |
layeredPane
管理菜单栏和内容窗格的分层窗格。
|
protected JMenuBar |
menuBar
菜单栏。
|
static int |
NONE
用于windowDecorationStyle属性的常量。
|
static int |
PLAIN_DIALOG
用于windowDecorationStyle属性的常量。
|
static int |
QUESTION_DIALOG
用于windowDecorationStyle属性的常量。
|
static int |
WARNING_DIALOG
用于windowDecorationStyle属性的常量。
|
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
Constructor and Description |
---|
JRootPane()
创建一个
JRootPane ,设立了
glassPane ,
layeredPane 和
contentPane 。
|
Modifier and Type | Method and Description |
---|---|
protected void |
addImpl(Component comp, Object constraints, int index)
覆盖以执行玻璃部件的位置作为零子。
|
void |
addNotify()
通知此组件它现在有一个父组件。
|
protected Container |
createContentPane()
由构造函数调用方法创建默认的
contentPane 。
|
protected Component |
createGlassPane()
由构造函数调用方法创建默认的
glassPane 。
|
protected JLayeredPane |
createLayeredPane()
由构造函数调用方法创建默认的
layeredPane 。
|
protected LayoutManager |
createRootLayout()
由构造函数调用方法创建默认的
layoutManager 。
|
AccessibleContext |
getAccessibleContext()
获取
AccessibleContext 与此相关
JRootPane 。
|
Container |
getContentPane()
返回内容窗格 - 保存由根窗格父化的组件的容器。
|
JButton |
getDefaultButton()
返回
defaultButton 属性的值。
|
Component |
getGlassPane()
返回此
JRootPane 的当前玻璃窗格。
|
JMenuBar |
getJMenuBar()
从分层窗格返回菜单栏。
|
JLayeredPane |
getLayeredPane()
获取根窗格使用的分层窗格。
|
JMenuBar |
getMenuBar()
已弃用
从Swing版本1.0.3替换为
getJMenuBar() 。
|
RootPaneUI |
getUI()
返回渲染此组件的L&F对象。
|
String |
getUIClassID()
返回一个字符串,它指定呈现此组件的L&F类的名称。
|
int |
getWindowDecorationStyle()
返回一个恒定识别窗口装饰品的类型
JRootPane 被提供。
|
boolean |
isOptimizedDrawingEnabled()
glassPane 和
contentPane 具有相同的界限,这意味着
JRootPane 不会
JRootPane 的孩子,这应该返回false。
|
boolean |
isValidateRoot()
如果这个JRootPane的
JRootPane 打电话
revalidate ,从这里下来验证。
|
protected String |
paramString()
返回此
JRootPane 的字符串表示
JRootPane 。
|
void |
removeNotify()
通知此组件它不再具有父组件。
|
void |
setContentPane(Container content)
设置内容窗格 - 保存由根窗格加载的组件的容器。
|
void |
setDefaultButton(JButton defaultButton)
设置
defaultButton 属性,它确定这个当前的默认按钮
JRootPane 。
|
void |
setDoubleBuffered(boolean aFlag)
设置此组件是否应该使用缓冲区来绘制。
|
void |
setGlassPane(Component glass)
设置指定的
Component 成为这根窗格玻璃板。
|
void |
setJMenuBar(JMenuBar menu)
添加或更改分层窗格中使用的菜单栏。
|
void |
setLayeredPane(JLayeredPane layered)
设置根窗格的分层窗格。
|
void |
setMenuBar(JMenuBar menu)
已弃用
从Swing版本1.0.3替换为
setJMenuBar(JMenuBar menu) 。
|
void |
setUI(RootPaneUI ui)
设置渲染此组件的L&F对象。
|
void |
setWindowDecorationStyle(int windowDecorationStyle)
设置
JRootPane 应该提供的窗口装饰类型(如边框,关闭窗口的小部件,标题...)。
|
void |
updateUI()
将UI属性重置为当前外观的值。
|
addAncestorListener, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, paint, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
public static final int NONE
JRootPane
不应提供任何类型的窗口装饰。
public static final int FRAME
JRootPane
应提供适用于框架的装饰。
public static final int PLAIN_DIALOG
JRootPane
应提供适合于Dialog的装饰。
public static final int INFORMATION_DIALOG
JRootPane
应提供适用于显示信息性消息的Dialog的装饰。
public static final int ERROR_DIALOG
JRootPane
应提供适用于显示错误消息的Dialog的装饰。
public static final int COLOR_CHOOSER_DIALOG
JRootPane
应提供适用于显示JColorChooser
的Dialog的JColorChooser
。
public static final int FILE_CHOOSER_DIALOG
JRootPane
应提供适用于显示JFileChooser
的Dialog的JFileChooser
。
public static final int QUESTION_DIALOG
JRootPane
应提供适合用于向用户呈现问题的Dialog的装饰。
public static final int WARNING_DIALOG
JRootPane
应提供适用于显示警告消息的Dialog的装饰。
protected JMenuBar menuBar
protected Container contentPane
protected JLayeredPane layeredPane
protected Component glassPane
protected JButton defaultButton
@Deprecated protected javax.swing.JRootPane.DefaultAction defaultPressAction
Action
在JRootPane
的ActionMap
。
有关详细信息,请参阅密钥绑定规范。
defaultButton
@Deprecated protected javax.swing.JRootPane.DefaultAction defaultReleaseAction
Action
在JRootPane
的ActionMap
。
有关详细信息,请参阅密钥绑定规范。
defaultButton
public void setDoubleBuffered(boolean aFlag)
Component
被缓冲,并且其祖先之一也被缓存,那么将使用祖先缓冲区。
setDoubleBuffered
在
JComponent
aFlag
- 如果为true,请将此组件设置为双缓冲
public int getWindowDecorationStyle()
JRootPane
被提供。
NONE
,
FRAME
,
PLAIN_DIALOG
,
INFORMATION_DIALOG
,
ERROR_DIALOG
,
COLOR_CHOOSER_DIALOG
,
FILE_CHOOSER_DIALOG
,
QUESTION_DIALOG
或
WARNING_DIALOG
。
setWindowDecorationStyle(int)
public void setWindowDecorationStyle(int windowDecorationStyle)
JRootPane
应提供的窗口装饰类型(如边框,关闭窗口的小部件,标题...)。
默认是不提供窗口装饰( NONE
)。
这只是一个提示,一些看起来和感觉可能不支持这一点。 这是一个绑定属性。
windowDecorationStyle
- 常规识别提供的窗口装饰。
IllegalArgumentException
-如果
style
不是一个:
NONE
,
FRAME
,
PLAIN_DIALOG
,
INFORMATION_DIALOG
,
ERROR_DIALOG
,
COLOR_CHOOSER_DIALOG
,
FILE_CHOOSER_DIALOG
,
QUESTION_DIALOG
,或
WARNING_DIALOG
。
JDialog.setDefaultLookAndFeelDecorated(boolean)
,
JFrame.setDefaultLookAndFeelDecorated(boolean)
,
LookAndFeel.getSupportsWindowDecorations()
public RootPaneUI getUI()
LabelUI
对象
public void setUI(RootPaneUI ui)
ui
-
LabelUI
L&F对象
UIDefaults.getUI(javax.swing.JComponent)
public void updateUI()
updateUI
在
JComponent
JComponent.updateUI()
public String getUIClassID()
getUIClassID
在
JComponent
JComponent.getUIClassID()
,
UIDefaults.getUI(javax.swing.JComponent)
protected JLayeredPane createLayeredPane()
layeredPane
。
Bt默认它创建一个新的JLayeredPane
。
layeredPane
protected Container createContentPane()
contentPane
。
默认情况下,此方法创建一个新的JComponent
添加一个BorderLayout
作为其LayoutManager
。
contentPane
protected Component createGlassPane()
glassPane
。
默认情况下,此方法创建一个新的JComponent
,其可见性设置为false。
glassPane
protected LayoutManager createRootLayout()
layoutManager
。
layoutManager
。
public void setJMenuBar(JMenuBar menu)
menu
-
JMenuBar
加
@Deprecated public void setMenuBar(JMenuBar menu)
setJMenuBar(JMenuBar menu)
。
menu
- 加
JMenuBar
。
public JMenuBar getJMenuBar()
JMenuBar
@Deprecated public JMenuBar getMenuBar()
getJMenuBar()
。
JMenuBar
public void setContentPane(Container content)
Swing的绘画架构需要在JComponent
中不透明的JComponent。 这通常由内容窗格提供。 如果更换内容窗格,建议将其替换为不透明的JComponent
。
content
-在
Container
要使用组件的内容
IllegalComponentStateException
- (运行时异常),如果内容窗格参数是
null
public Container getContentPane()
Container
保持所述组件的内容
public void setLayeredPane(JLayeredPane layered)
JMenuBar
。
layered
-
JLayeredPane
使用
IllegalComponentStateException
- (运行时异常)如果分层窗格参数为
null
public JLayeredPane getLayeredPane()
JMenuBar
。
JLayeredPane
使用的
JLayeredPane
public void setGlassPane(Component glass)
Component
成为这根窗格玻璃板。
玻璃窗格通常应该是一个轻量级的透明组件,因为当根窗格需要抓取输入事件时,它将被显示。
新的玻璃窗格的可见性已更改为与当前玻璃窗格相匹配。 这意味着,当您要更换玻璃窗格并使其可见时,必须小心。 以下任何一种都可以工作:
root.setGlassPane(newGlassPane);
newGlassPane.setVisible(true);
要么:
root.getGlassPane().setVisible(true);
root.setGlassPane(newGlassPane);
glass
-
Component
用作这个
JRootPane
NullPointerException
- 如果
glass
参数是
null
public Component getGlassPane()
JRootPane
的当前玻璃窗格。
setGlassPane(java.awt.Component)
public boolean isValidateRoot()
JRootPane
打电话revalidate
,从这里下来验证。
延迟请求再次布置组件及其后代。 例如,调用revalidate
,被推到JRootPane
或JScrollPane
,因为这两个类覆盖isValidateRoot
以返回true。
isValidateRoot
在
JComponent
JComponent.isValidateRoot()
,
Container.isValidateRoot()
public boolean isOptimizedDrawingEnabled()
glassPane
和contentPane
具有相同的界限,这意味着JRootPane
不会JRootPane
,这应该返回false。
另一方面, glassPane
通常不可见,因此如果glassPane
不可见,则可以返回true。
因此,这里的返回值取决于glassPane的glassPane
。
isOptimizedDrawingEnabled
在
JComponent
public void addNotify()
KeyboardAction
事件侦听器设置。
该方法在内部被工具包调用,不应该被程序直接调用。
public void removeNotify()
KeyboardAction
。
该方法在内部被工具包调用,不应该被程序直接调用。
public void setDefaultButton(JButton defaultButton)
defaultButton
属性,它确定这个当前的默认按钮JRootPane
。
默认按钮是在根界面中发生UI定义的激活事件(通常为Enter键)时将激活的按钮,无论按钮是否具有键盘焦点(除非根窗格中有另一个组件消耗激活事件,如JTextPane
)。
要使默认激活工作,当激活发生时,该按钮必须是根窗格的启用后代。
要从此根窗格中删除默认按钮,请将此属性设置为null
。
defaultButton
-
JButton
哪个是默认按钮
JButton.isDefaultButton()
public JButton getDefaultButton()
defaultButton
属性的值。
JButton
是目前的默认按钮
setDefaultButton(javax.swing.JButton)
protected void addImpl(Component comp, Object constraints, int index)
addImpl
在
Container
comp
- 要增强的组件
constraints
- 要遵守的约束
index
- 指数
Container.add(Component)
, Container.add(Component, int)
, Container.add(Component, java.lang.Object)
, Container.invalidate()
, LayoutManager
, LayoutManager2
protected String paramString()
JRootPane
的字符串表示JRootPane
。
该方法仅用于调试目的,并且返回的字符串的内容和格式可能因实现而异。
返回的字符串可能为空,但可能不是null
。
paramString
在
JComponent
JRootPane
的字符串表示
JRootPane
。
public AccessibleContext getAccessibleContext()
AccessibleContext
与此相关JRootPane
。
为根窗格,所述AccessibleContext
需要一个的形式AccessibleJRootPane
。
如有必要,将创建一个新的AccessibleJRootPane
实例。
getAccessibleContext
在界面
Accessible
getAccessibleContext
在
Component
AccessibleJRootPane
作为这个
AccessibleContext
的
JRootPane
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.