Module java.desktop

Package javax.swing


package javax.swing
提供一组“轻量级”(全部使用Java语言)组件,尽可能在所有平台上保持一致。有关如何使用这些组件的程序员指南,请参阅使用JFC/Swing创建GUI,这是Java教程中的一个章节。有关其他资源,请参见相关文档

Swing的线程策略

一般来说,Swing不是线程安全的。所有Swing组件和相关类(除非另有说明)必须在事件分派线程上访问。

典型的Swing应用程序会在响应用户手势生成的事件中进行处理。例如,单击JButton会通知所有添加到JButtonActionListeners。由于所有用户手势生成的事件都在事件分派线程上分派,大多数开发人员不会受到此限制的影响。

然而,影响所在的地方在于构建和显示Swing应用程序。对应用程序的main方法的调用,或者对Applet的方法的调用,不会在事件分派线程上调用。因此,在构建和显示应用程序或小程序时,必须小心将控制权转移到事件分派线程。转移控制并开始使用Swing的首选方法是使用invokeLaterinvokeLater方法安排一个Runnable在事件分派线程上处理。以下两个示例同样适用于转移控制和启动Swing应用程序:

 import javax.swing.SwingUtilities;

 public class MyApp implements Runnable {
     public void run() {
         // 在事件分派线程上调用。
         // 构建和显示GUI。
     }

     public static void main(String[] args) {
         SwingUtilities.invokeLater(new MyApp());
     }
 }
或者:
 import javax.swing.SwingUtilities;

 public class MyApp {
     MyApp(String[] args) {
         // 在事件分派线程上调用。
         // 在此处进行任何初始化。
     }

     public void show() {
         // 显示UI。
     }

     public static void main(final String[] args) {
         // 为事件分派线程安排一个任务:
         // 创建并显示此应用程序的GUI。
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                 new MyApp(args).show();
             }
         });
     }
 }
此限制也适用于附加到Swing组件的模型。例如,如果将TableModel附加到JTable,则TableModel只能在事件分派线程上修改。如果在单独的线程上修改模型,则会出现异常和可能的显示损坏。

尽管在事件分派线程上立即更新UI通常是安全的,但有一个例外:如果模型侦听器尝试在UI更新以反映待处理更改之前进一步更改UI,则UI可能会显示不正确。如果应用程序安装的侦听器需要根据将导致模型结构更改的事件更新UI,则首先允许组件安装的侦听器处理此更改非常重要,因为无法保证调用侦听器的顺序。解决方案是让应用程序侦听器使用SwingUtilities.invokeLater(Runnable)进行更改,以便在处理完组件安装的所有模型侦听器之后执行任何UI渲染更改。

由于所有事件都在事件分派线程上传递,因此在事件处理中必须小心。特别是,在事件分派线程上执行的长时间运行任务,例如网络IO或计算密集型处理,会阻塞事件分派线程,使应用程序对用户输入完全无响应。在使用Swing时,建议参考SwingWorker来执行此类处理的首选方法。

有关此主题的更多信息,请参阅Swing教程,特别是关于Swing中的并发性部分。

Swing的序列化策略

警告:任何Swing类的序列化对象将不兼容未来的Swing版本。当前的序列化支持适用于短期存储或在运行相同版本Swing的应用程序之间进行RMI。从1.4版本开始,已向java.beans包添加了对所有JavaBeans的长期存储支持。

相关文档

有关概述、教程、示例、指南和其他文档,请参见:
  • Class
    Description
    该类为JFC Action接口提供了默认实现。
    为按钮和菜单项定义通用行为。
    CellEditors的基类,为CellEditor接口中的方法提供了默认实现,除了getCellEditorValue()
    为提供其内容的List定义数据模型的抽象定义。
    该类提供了SpinnerModel接口的ChangeListener部分,适用于大多数具体的SpinnerModel实现。
    Action接口为ActionListener接口提供了有用的扩展,用于多个控件可能访问相同功能的情况。
    ActionMap提供从Object(称为Action名称)到Action的映射。
    用于提供标准Border对象的工厂类。
    定义由SliderProgressBar等组件使用的数据模型。
    Box
    使用BoxLayout对象作为其布局管理器的轻量级容器。
    用于参与布局但没有视图的轻量级组件的实现。
    允许多个组件垂直或水平布局的布局管理器。
    用于为一组按钮创建多重排除范围的类。
    按钮的状态模型。
    此接口定义任何通用编辑器应能够实现的方法。
    插入在单元格渲染器和使用它们的组件之间的编辑器组件。
    用于JComboBox组件的编辑器组件。
    用于组合框的数据模型。
    ComponentInputMap是与特定JComponent关联的InputMap
    支持图形调试的Graphics子类。
    BoundedRangeModel的通用实现。
    Button组件的数据模型的默认实现。
    表格和树单元格的默认编辑器。
    组合框的默认模型。
    这是DesktopManager的实现。
    该类已被1.4焦点API所淘汰。
    在列表中呈现项目的子类。
    实现了UIResource的DefaultListCellRenderer的子类。
    该类松散实现了java.util.Vector API,即实现了java.util.Vector的1.1.x版本,不具有集合类支持,并在发生更改时通知ListDataListener
    列表选择的默认数据模型。
    提供围绕基于网格的数据模型进行排序和过滤的RowSorter的实现。
    DefaultRowSorter.ModelWrapper负责提供由DefaultRowSorter排序的数据。
    SingleSelectionModel的通用实现。
    DesktopManager对象由JDesktopPane对象拥有。
    用于确定组件在拖放期间跟踪和指示放置位置的方法的拖放模式。
    该类已被1.4焦点API所淘汰。
    通过将图像转换为灰度图像并增亮图像中的像素,将图像“禁用”的图像滤镜。
    GroupLayout是一种LayoutManager,用于按层次分组组件以将它们定位在Container中。
    ParallelGroup可以对齐其子级的可能方式的枚举。
    一种小型固定大小的图片,通常用于装饰组件。
    从图像绘制图标的Icon接口的实现。
    InputMap提供输入事件(当前仅使用KeyStroke)与Object之间的绑定。
    该类为Swing组件提供验证机制。
    FocusTraversalPolicy可以选择性地提供用于确定JInternalFrame的初始组件的算法。
    Deprecated, for removal: This API element is subject to removal in a future version.
    The Applet API is deprecated, no replacement.
    一个“推”按钮的实现。
    一个复选框的实现--一个可以被选中或取消选中的项目,并向用户显示其状态。
    可以被选中或取消选中的菜单项。
    JColorChooser 提供了一个控件面板,允许用户操纵和选择颜色。
    一个组合了按钮或可编辑字段和下拉列表的组件。
    定义了一个KeySelectionManager的接口。
    除了顶层容器之外,所有Swing组件的基类。
    用于创建多文档界面或虚拟桌面的容器。
    创建对话框窗口的主要类。
    用于编辑各种内容的文本组件。
    JFileChooser 提供了一个简单的机制,让用户选择文件。
    JFormattedTextField扩展了JTextField,支持格式化任意值,并在用户编辑文本后检索特定对象。
    AbstractFormatter的实例被JFormattedTextField用于处理从对象到字符串的转换,以及从字符串到对象的转换。
    AbstractFormatterFactory的实例被JFormattedTextField用于获取AbstractFormatter的实例,后者用于格式化值。
    java.awt.Frame的扩展版本,增加了对JFC/Swing组件架构的支持。
    一个轻量级对象,提供了许多本地框架的特性,包括拖动、关闭、成为图标、调整大小、显示标题以及支持菜单栏。
    该组件代表了JInternalFrame的图标化版本。
    用于显示短文本字符串或图像的显示区域。
    JLayer<V extends Component>
    JLayer是Swing组件的通用装饰器,使您能够实现各种高级绘画效果,并接收其边界内生成的所有AWTEvent的通知。
    JLayeredPane为JFC/Swing容器添加了深度,允许组件在需要时重叠。
    JList<E>
    显示对象列表并允许用户选择一个或多个项目的组件。
    表示JList的拖放位置的TransferHandler.DropLocation的子类。
    菜单的实现--一个包含JMenuItem的弹出窗口,在用户选择JMenuBar上的项目时显示。
    菜单栏的实现。
    菜单中的项目的实现。
    JOptionPane使弹出标准对话框框变得容易,提示用户输入值或通知他们某事。
    JPanel是一个通用的轻量级容器。
    JPasswordField是一个轻量级组件,允许编辑单行文本,其中视图指示已输入内容,但不显示原始字符。
    弹出菜单的实现--一个弹出并显示一系列选择项的小窗口。
    弹出菜单特定的分隔符。
    用于直观显示某个任务进度的组件。
    单选按钮的实现--一个可以被选中或取消选中的项目,并向用户显示其状态。
    单选按钮菜单项的实现。
    JFrameJDialogJWindowJAppletJInternalFrame背后使用的轻量级容器。
    滚动条的实现。
    提供轻量级组件的可滚动视图。
    JSeparator提供了一个通用的组件,用于实现分隔线--最常用于菜单项之间的分隔符,将它们分成逻辑分组。
    允许用户通过在有界区间内滑动旋钮来图形化选择值的组件。
    允许用户从有序序列中选择数字或对象值的单行输入字段。
    JSpinner的编辑器,其模型是SpinnerDateModel
    用于更专业的编辑器的简单基类,显示模型当前值的只读视图,使用JFormattedTextField
    JSpinner的编辑器,其模型是SpinnerListModel
    JSpinner的编辑器,其模型是SpinnerNumberModel
    JSplitPane用于分割两个(仅限两个)Component
    允许用户通过点击具有给定标题和/或图标的选项卡在一组组件之间切换的组件。
    JTable用于显示和编辑常规的二维表格单元。
    表示JTable的拖放位置的TransferHandler.DropLocation的子类。
    用于打印JTable的打印模式。
    JTextArea是一个显示纯文本的多行区域。
    JTextField是一个轻量级组件,允许编辑单行文本。
    可以用图形属性标记的文本组件,以图形方式表示这些属性。
    一个两状态按钮的实现。
    切换按钮模型。
    JToolBar提供了一个用于显示常用Action或控件的组件。
    用于工具栏的分隔符。
    用于为组件显示“提示”的控件。
    将一组分层数据显示为大纲的控件。
    表示JTree的拖放位置的TransferHandler.DropLocation的子类。
    DynamicUtilTreeNode可以包装向量/哈希表/数组/字符串,并根据需要创建适当的子树节点。
    EmptySelectionModel是一个不允许选择任何内容的TreeSelectionModel
    用于查看底层信息的“视口”或“窗口”。
    JWindow是一个容器,可以在用户的桌面上的任何位置显示。
    KeyStroke表示键盘上的键动作,或等效输入设备上的动作。
    SortingFocusTraversalPolicy根据组件的大小、位置和方向对组件进行排序,用于方便布局管理器。
    LayoutStyle提供有关如何定位组件的信息。
    ComponentPlacement是两个组件相对放置的可能方式的枚举。
    标识可用作“橡皮图章”以绘制JList中单元格的组件。
    该接口定义了像JList这样的组件用于获取列表中每个单元格的值以及列表长度的方法。
    该接口表示显示具有稳定索引值的值列表的任何组件的选择的当前状态。
    如其名称所示,LookAndFeel封装了外观和感觉。
    任何可以放入菜单中的组件都应该实现这个接口。
    MenuSelectionManager拥有菜单层次结构中的选择。
    ComboBoxModel的可变版本。
    用于将组件叠加在彼此之上的布局管理器。
    Painter<T>
    一个绘画代理。
    弹出窗口用于向用户显示一个Component,通常显示在特定包含层次结构中所有其他Component的顶部。
    如其名称所示,PopupFactory用于获取Popup的实例。
    用于监视某个操作的进度的类。
    监视从某个InputStream读取的进度。
    定义了负责“渲染”(显示)值的对象的要求。
    该类管理重绘请求,允许最小化重绘次数,例如通过将多个请求合并为组件树成员的单个重绘。
    该接口由具有单个JRootPane子级的组件实现:JDialog、JFrame、JWindow、JApplet、JInternalFrame。
    RowFilter<M,I>
    RowFilter用于过滤模型中的条目,以便它们不显示在视图中。
    一些默认RowFilter支持的可能比较值的枚举。
    一个Entry对象被传递给RowFilter的实例,允许过滤器获取条目数据的值,从而确定是否应该显示该条目。
    RowSorter提供了排序和过滤的基础。
    SortKey描述了特定列的排序顺序。
    为像JScrollPane这样的滚动容器提供信息的接口。
    与JScrollPane组件一起使用的常量。
    JScrollPane使用的布局管理器。
    ScrollPaneLayout的UI资源版本。
    支持最多一个索引选择的模型。
    为布局管理器的方便,计算关于组件大小和位置的信息。
    一个SizeSequence对象高效地维护一个有序大小列表和相应位置。
    根据给定的Comparator对焦点遍历周期的组件进行排序的FocusTraversalPolicy。
    SortOrder是可能的排序方式的枚举。
    用于Date序列的SpinnerModel
    一个简单的SpinnerModel实现,其值由数组或List定义。
    用于潜在无界对象值序列的模型。
    用于数字序列的SpinnerModel
    Spring类的一个实例包含三个属性,用于描述其行为:最小值、首选值和最大值。
    SpringLayout根据一组约束条件布局其关联容器的子组件。
    Constraints对象保存控制组件在由SpringLayout控制的容器中大小和位置变化的约束。
    一组通常用于在屏幕上定位和定向组件的常量。
    用于为自动生成的BeanInfo类指定一些与swing相关信息的注释。
    用于Swing的一组实用方法。
    用于在后台线程中执行冗长的GUI交互任务的抽象类。
    state绑定属性的值。
    在指定的时间间隔内触发一个或多个ActionEvent
    管理系统中所有ToolTips
    该类用于处理Transferable到Swing组件之间的传输。
    表示应插入拖放数据的位置。
    该类封装了剪贴板或拖放传输的所有相关细节,并允许自定义拖放体验的各个方面。
    该接口仅用于为由UI设置的JComponent客户属性的键进行标记,这些属性需要在L&F更改和序列化时清除。
    Swing组件的默认表。
    该类使您能够在每次使用getXXX(key)方法查找时构造的默认表中存储一个条目。
    LazyInputMap将在其createValue方法中创建一个InputMap
    该类使您能够在首次使用getXXX(key)方法查找时才构造默认表中的条目。
    该类提供了LazyValue的实现,可用于延迟加载用于创建实例的类。
    UIManager管理当前外观和感觉、可用外观和感觉集、当外观和感觉更改时通知的PropertyChangeListeners、外观和感觉默认值,以及用于获取各种默认值的便捷方法。
    为了配置菜单或初始应用程序设置而提供有关已安装的LookAndFeel的一些信息。
    表示用户系统上不存在请求的外观管理类的异常。
    JViewport的默认布局管理器。
    用于控制窗口关闭操作的常量。