包 javax.swing
Swing 的线程策略
一般来说,Swing 不是线程安全的。除非另有说明,否则所有 Swing 组件和相关类都必须在事件调度线程上访问。典型的 Swing 应用程序会响应用户手势生成的事件进行处理。例如,单击 JButton
会通知所有添加到 JButton
的 ActionListeners
。由于从用户手势生成的所有事件都在事件分派线程上分派,因此大多数开发人员不会受到限制的影响。
然而,影响在于构建和显示 Swing 应用程序。对应用程序的 main
方法或 Applet
中的方法的调用不会在事件调度线程上调用。因此,在构建和显示应用程序或小程序时,必须注意将控制转移到事件调度线程。转移控制权并开始使用 Swing 的首选方法是使用 invokeLater
。 invokeLater
方法安排一个 Runnable
在事件调度线程上处理。以下两个示例同样适用于转移控制和启动 Swing 应用程序:
import javax.swing.SwingUtilities; public class MyApp implements Runnable { public void run() { // Invoked on the event dispatching thread. // Construct and show GUI. } public static void main(String[] args) { SwingUtilities.invokeLater(new MyApp()); } }或:
import javax.swing.SwingUtilities; public class MyApp { MyApp(String[] args) { // Invoked on the event dispatching thread. // Do any initialization here. } public void show() { // Show the UI. } public static void main(final String[] args) { // Schedule a job for the event-dispatching thread: // creating and showing this application's 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 或计算密集型处理,会阻止事件分派线程分派任何其他事件。当事件调度线程被阻塞时,应用程序完全不响应用户输入。请参阅 SwingWorker
,了解在使用 Swing 时执行此类处理的首选方法。
有关此主题的更多信息,请参阅 摇摆教程,尤其是 Swing 中的并发 部分。
相关文档
有关概述、教程、示例、指南和其他文档,请参阅:-
类描述此类为 JFC
Action
接口提供默认实现。定义按钮和菜单项的通用行为。CellEditors
的基类,为CellEditor
接口中的方法提供默认实现,getCellEditorValue()
除外。提供List
及其内容的数据模型的抽象定义。此类提供 SpinnerModel 接口的 ChangeListener 部分,它应该适用于大多数具体的 SpinnerModel 实现。在多个控件可以访问相同功能的情况下,Action
接口为ActionListener
接口提供了有用的扩展。ActionMap
提供从Object
s(称为 keys 或Action
names )到Action
s 的映射。用于出售标准Border
对象的工厂类。定义Slider
s 和ProgressBar
s 等组件使用的数据模型。使用 BoxLayout 对象作为其布局管理器的轻量级容器。参与布局但没有视图的轻量级组件的实现。允许多个组件垂直或水平布局的布局管理器。此类用于为一组按钮创建多重排除范围。按钮的状态模型。这个接口定义了任何通用编辑器应该能够实现的方法。此类插入在单元格渲染器和使用它们的组件之间。用于 JComboBox 组件的编辑器组件。ComboBoxModel <E>组合框的数据模型。ComponentInputMap
是与特定JComponent
关联的InputMap
。支持图形调试的图形子类。BoundedRangeModel 的通用实现。Button
组件数据模型的默认实现。表格和树单元格的默认编辑器。组合框的默认模型。这是DesktopManager
的实现。此类已被 1.4 焦点 API 废弃。呈现列表中的项目。实现 UIResource 的 DefaultListCellRenderer 的子类。DefaultListModel <E>此类松散地实现了java.util.Vector
API,因为它实现了java.util.Vector
的 1.1.x 版本,没有集合类支持,并在发生更改时通知ListDataListener
s。列表选择的默认数据模型。DefaultRowSorter <M,I> RowSorter
的实现,提供围绕基于网格的数据模型的排序和过滤。DefaultRowSorter.ModelWrapper
负责提供由DefaultRowSorter
排序的数据。SingleSelectionModel 的通用实现。DesktopManager 对象由 JDesktopPane 对象拥有。放置模式,用于确定组件在拖放过程中跟踪和指示放置位置的方法。此类已被 1.4 焦点 API 废弃。一种图像过滤器,通过将图像变成灰度图像并使图像中的像素变亮来“禁用”图像。GroupLayout
是一个LayoutManager
,它对组件进行分层分组,以便将它们放置在Container
中。枚举ParallelGroup
对齐其子项的可能方式。固定尺寸的小图片,通常用于装饰组件。从图像绘制图标的图标接口的实现。InputMap
提供输入事件(目前仅使用KeyStroke
)和Object
之间的绑定。此类为 Swing 组件提供验证机制。一个 FocusTraversalPolicy,它可以选择提供一种算法来确定 JInternalFrame 的初始组件。已弃用,将被删除:此 API 元素可能会在未来版本中删除。Applet API 已弃用,没有替代品。“按下”按钮的实现。复选框的实现——可以选择或取消选择的项目,并向用户显示其状态。可以选择或取消选择的菜单项。JColorChooser
提供了一个控件面板,旨在允许用户操纵和选择颜色。JComboBox <E>组合按钮或可编辑字段和下拉列表的组件。定义KeySelectionManager
的接口。除顶级容器外的所有 Swing 组件的基类。用于创建多文档界面或虚拟桌面的容器。用于创建对话窗口的主类。用于编辑各种内容的文本组件。JFileChooser
为用户选择文件提供了一种简单的机制。JFormattedTextField
extendsJTextField
添加对格式化任意值的支持,以及在用户编辑文本后检索特定对象。AbstractFormatter
的实例被JFormattedTextField
用来处理从对象到字符串的转换,以及从字符串到对象的转换。AbstractFormatterFactory
的实例被JFormattedTextField
用于获取AbstractFormatter
的实例,后者又用于格式化值。java.awt.Frame
的扩展版本,增加了对 JFC/Swing 组件架构的支持。一个轻量级对象,它提供了原生框架的许多功能,包括拖动、关闭、成为图标、调整大小、标题显示以及对菜单栏的支持。该组件代表JInternalFrame
的图标化版本。短文本字符串或图像或两者的显示区域。JLayer
是 Swing 组件的通用装饰器,它使您能够实现各种高级绘画效果,并接收在其边界内生成的所有AWTEvent
的通知。JLayeredPane
增加了 JFC/Swing 容器的深度,允许组件在需要时相互重叠。JList <E>显示对象列表并允许用户选择一个或多个项目的组件。TransferHandler.DropLocation
的子类,表示JList
的放置位置。菜单的实现——一个包含JMenuItem
的弹出窗口,当用户在JMenuBar
上选择一个项目时显示。菜单栏的实现。菜单中项目的实现。JOptionPane
可以很容易地弹出一个标准对话框,提示用户输入一个值或通知他们一些事情。JPanel
是一个通用的轻量级容器。JPasswordField
是一个轻量级组件,允许编辑单行文本,其中视图指示已键入内容,但不显示原始字符。弹出菜单的实现——弹出并显示一系列选项的小窗口。特定于弹出菜单的分隔符。可视化显示某些任务进度的组件。单选按钮的实现——可以选择或取消选择的项目,并向用户显示其状态。单选按钮菜单项的实现。JFrame
、JDialog
、JWindow
、JApplet
和JInternalFrame
在幕后使用的轻量级容器。滚动条的实现。提供轻量级组件的可滚动视图。JSeparator
提供了一个用于实现分隔线的通用组件 - 最常用作菜单项之间的分隔线,将它们分解为逻辑分组。允许用户通过在有界间隔内滑动旋钮以图形方式选择值的组件。允许用户从有序序列中选择数字或对象值的单行输入字段。模型为SpinnerDateModel
的JSpinner
的编辑器。一个简单的基类,用于更专业的编辑器,它使用JFormattedTextField
显示模型当前值的只读视图。模型为SpinnerListModel
的JSpinner
的编辑器。模型为SpinnerNumberModel
的JSpinner
的编辑器。JSplitPane
用于划分两个(并且只有两个)Component
s。允许用户通过单击具有给定标题和/或图标的选项卡在一组组件之间切换的组件。JTable
用于显示和编辑常规的二维单元格表。TransferHandler.DropLocation
的子类,表示JTable
的放置位置。打印模式,用于打印JTable
s。JTextArea
是显示纯文本的多行区域。JTextField
是一个允许编辑单行文本的轻量级组件。可以用图形表示的属性标记的文本组件。两种状态按钮的实现。切换按钮模型JToolBar
提供了一个组件,可用于显示常用的Action
或控件。特定于工具栏的分隔符。用于显示组件的“提示”。将一组分层数据显示为大纲的控件。TransferHandler.DropLocation
的子类,表示JTree
的放置位置。DynamicUtilTreeNode
可以包装向量/哈希表/数组/字符串,并根据需要创建适当的子树节点。EmptySelectionModel
是一个不允许选择任何内容的TreeSelectionModel
。您可以通过它查看基础信息的“视口”或“舷窗”。JWindow
是一个容器,可以显示在用户桌面的任何位置。KeyStroke 表示键盘或等效输入设备上的键操作。一个 SortingFocusTraversalPolicy,它根据组件的大小、位置和方向对组件进行排序。LayoutStyle
提供有关如何定位组件的信息。ComponentPlacement
是两个组件相对于彼此放置的可能方式的枚举。ListCellRenderer <E>标识可用作“橡皮图章”以绘制 JList 中的单元格的组件。ListModel <E>该接口定义了 JList 等组件用于获取列表中每个单元格的值和列表长度的方法。此界面表示显示具有稳定索引的值列表的任何组件的当前选择状态。LookAndFeel
顾名思义,封装了外观。任何可以放入菜单的组件都应该实现这个接口。MenuSelectionManager 拥有菜单层次结构中的选择。ComboBoxModel
的可变版本。一个布局管理器,用于将组件排列在彼此之上。Painter <T>绘画代表。弹出窗口用于向用户显示Component
,通常在特定包含层次结构中的所有其他Component
之上。PopupFactory
顾名思义,用于获取Popup
的实例。一个类来监视某些操作的进度。监视从某些 InputStream 读取的进度。定义负责“呈现”(显示)值的对象的要求。此类管理重绘请求,允许最小化重绘次数,例如通过将多个请求折叠为组件树成员的单个重绘。此接口由具有单个 JRootPane 子级的组件实现:JDialog、JFrame、JWindow、JApplet、JInternalFrame。RowFilter <M,I> RowFilter
用于从模型中过滤掉条目,以便它们不显示在视图中。一些默认RowFilter
支持的可能比较值的枚举。RowFilter.Entry <M,I> Entry
对象被传递给RowFilter
的实例,允许过滤器获取条目数据的值,从而确定是否应显示该条目。RowSorter <男>RowSorter
提供排序和过滤的基础。SortKey 描述特定列的排序顺序。为滚动容器(如 JScrollPane)提供信息的接口。与 JScrollPane 组件一起使用的常量。JScrollPane
使用的布局管理器。ScrollPaneLayout
的 UI 资源版本。最多支持一个索引选择的模型。为了方便布局管理器,计算有关组件大小和位置的信息。SizeSequence
对象有效地维护了大小和对应位置的有序列表。一个 FocusTraversalPolicy,它通过根据给定的比较器对焦点遍历循环的组件进行排序来确定遍历顺序。SortOrder 是可能排序顺序的枚举。SpinnerModel
用于Date
的序列。SpinnerModel
的简单实现,其值由数组或List
定义。一个潜在无限对象值序列的模型。SpinnerModel
用于数字序列。Spring
类的实例拥有三个表征其行为的属性:minimum、preferred 和 maximum 值。SpringLayout
根据一组约束布置其关联容器的子级。Constraints
对象包含约束,这些约束控制组件大小和位置在SpringLayout
控制的容器中的变化方式。通常用于在屏幕上定位和定向组件的常量集合。用于为自动生成的BeanInfo
类指定一些挥杆相关信息的注释。Swing 实用方法的集合。SwingWorker <T,V> 一个抽象类,用于在后台线程中执行冗长的 GUI 交互任务。state
绑定属性的值。以指定的时间间隔触发一个或多个ActionEvent
s。管理系统中的所有ToolTips
。此类用于处理Transferable
与 Swing 组件之间的传输。表示应插入丢弃数据的位置。此类封装了剪贴板或拖放传输的所有相关细节,还允许自定义拖放体验的各个方面。此接口仅用于标记 UI 设置的JComponent
客户端属性的键,需要在 L&F 更改和序列化时清除。Swing 组件的默认值表。此类允许将条目存储在每次使用getXXX(key)
方法之一查找时构建的默认表中。LazyInputMap
将在其createValue
方法中创建一个InputMap
。此类使人们能够在默认表中存储一个条目,该条目在第一次使用getXXX(key)
方法之一查找时才构建。此类提供LazyValue
的实现,可用于延迟加载要创建的实例的类。UIManager
管理当前外观、可用外观集、外观更改时通知的PropertyChangeListeners
、外观默认值以及获取各种默认值的便捷方法。为配置菜单或初始应用程序设置提供有关已安装LookAndFeel
的一些信息。指示请求的外观管理类不存在于用户系统上的异常。JViewport
的默认布局管理器。用于控制窗口关闭操作的常量。