文本组件 API
原文:
docs.oracle.com/javase/tutorial/uiswing/components/textapi.html
本节列出了文本组件共享的常用 API 部分。这些 API 大部分由JTextComponent
类定义。文本组件特性讨论了如何使用部分 API。
JComponent 类描述了文本组件从JComponent
继承的 API。有关特定文本组件相关的 API 信息,请参阅该组件的操作页面:文本字段、密码字段、格式化文本字段、文本区域或编辑器窗格和文本窗格。
有关文本 API 的完整详细信息,请参阅JTextComponent
的 API 文档以及text package中各种类和接口的文档。
本节列出的 API 包括以下类别:
- 设置属性
- 选择操作
- 在模型和视图之间转换位置
- 文本编辑命令
- 表示文档的类和接口
- 处理文档
- 操作插入符和选择高亮器
- 读取和写入文本
设置属性
这些方法在JTextComponent
类中定义。
方法 | 描述 |
void setEditable(boolean) boolean isEditable() | 设置或指示用户是否可以编辑文本组件中的文本。 |
void setDragEnabled(boolean) boolean getDragEnabled() | 设置或获取dragEnabled 属性,必须为 true 才能在此组件上启用拖放处理。默认值为 false。有关更多详细信息,请参阅拖放和数据传输。 |
void setDisabledTextColor(Color) Color getDisabledTextColor() | 设置或获取文本组件被禁用时用于显示文本的颜色。 |
void setMargin(Insets) Insets getMargin() | 设置或获取文本与文本组件边框之间的边距。 |
操作选择
这些方法在JTextComponent
类中定义。
方法 | 描述 |
String getSelectedText() | 获取当前选定的文本。 |
void selectAll() void select(int, int) | 选择所有文本或选择起始和结束范围内的文本。 |
| void setSelectionStart(int) void setSelectionEnd(int)
int getSelectionEnd() | 通过索引设置或获取当前选择的范围。 |
void setSelectedTextColor(Color) Color getSelectedTextColor() | 设置或获取选定文本的颜色。 |
void setSelectionColor(Color) Color getSelectionColor() | 设置或获取选定文本的背景颜色。 |
在模型和视图之间转换位置
这些方法在JTextComponent
类中定义。
方法 | 描述 |
int viewToModel(Point) | 将视图坐标系中的指定点转换为文本中的位置。 |
Rectangle modelToView(int) | 将文本中指定位置转换为视图坐标系中的矩形。 |
文本编辑命令
类或方法 | 描述 |
(在JTextComponent
中) | 使用系统剪贴板剪切、复制和粘贴文本,或分别用参数指定的字符串替换所选文本。 |
EditorKit | 提供文本组件的视图工厂、文档、插入符号和操作,以及读取和写入特定格式的文档。 |
DefaultEditorKit | EditorKit 的具体子类,提供基本的文本编辑功能。 |
StyledEditorKit | Default EditorKit 的子类,为带样式文本提供额外的编辑功能。 |
字符串 xxxx操作 (在DefaultEditorKit 中) |
默认编辑器工具支持的所有操作的名称。请参见将文本操作与菜单和按钮关联。 |
(在DefaultEditorKit
中) | 实现各种文本编辑命令的内部类。 |
(在StyledEditorKit
中) | 实现各种编辑命令以处理带样式文本的内部类。 |
Action[] getActions() (在JTextComponent 中) |
获取此组件支持的操作。如果组件使用编辑器工具包,则此方法从编辑器工具包获取操作数组。 |
InputMap getInputMap() (在JComponent 中) |
获取将键绑定到操作的输入映射。参见将文本操作与键绑定。 |
void put(KeyStroke, Object) (在InputMap 中) |
将指定的键绑定到指定的操作。通常通过名称指定操作,对于标准编辑操作,使用字符串常量表示,如DefaultEditorKit.backwardAction 。 |
代表文档的类和接口
处理文档
类或方法 | 描述 |
DocumentFilter | 所有文档过滤器的超类。您可以使用文档过滤器来更改从文档中插入或移除的内容,而无需自己实现文档。参见实现文档过滤器。 |
void setDocumentFilter(DocumentFilter) (在AbstractDocument 中) |
设置文档过滤器。 |
| void setDocument(Document) Document getDocument() |
(在JTextComponent
中) | 设置或获取文本组件的文档。|
Document createDefaultModel() (在JTextField 中) |
创建一个默认的 PlainDocument 模型。覆盖此方法以创建自定义文档,而不是默认的PlainDocument 。 |
| void addDocumentListener(DocumentListener) void removeDocumentListener(DocumentListener) |
(在Document
中) | 添加或移除文档监听器。参见监听文档变化。|
| void addUndoableEditListener(UndoableEditListener) void removeUndoableEditListener(UndoableEditlistener) |
(在Document
中) | 添加或移除可撤销编辑监听器。可撤销编辑监听器用于实现撤销和重做。|
| int getLength() Position getStartPosition() |
(在Document
中) | 返回有关文档的各种描述信息的Document
方法。|
| Object getProperty(Object) void putProperty(Object, Object)
(在Document
中)
void setDocumentProperties(Dictionary)
Dictionary getDocumentProperties()
(在AbstractDocument
中) | 一个Document
维护一组属性,您可以使用这些方法来操作。 |
操纵插入符和选择高亮器
这些方法在JTextComponent
类中定义。
接口、类或方法 | 描述 |
插入符 | 定义表示文档内插入点的对象的 API 的接口。 |
DefaultCaret | 所有文本组件使用的默认插入符。 |
void setCaret(Caret) Caret getCaret() | 设置或获取文本组件使用的插入符对象。 |
void setCaretColor(Color) Color getCaretColor() | 设置或获取插入符的颜色。 |
| void setCaretPosition(int) void moveCaretPosition(int)
int getCaretPosition() | 设置或获取文档内插入符的当前位置。 |
void addCaretListener(CaretListener) void removeCaretListener(CaretListener) | 向文本组件添加或移除插入符监听器。 |
NavigationFilter | 所有导航过滤器的超类。导航过滤器允许您修改即将发生在文本组件中的插入符更改。 |
void setNavigationFilter(NavigationFilter) | 将导航过滤器附加到文本组件。 |
Highlighter | 定义用于突出显示当前选择的对象的 API 的接口。 |
DefaultHighlighter | 所有文本组件使用的默认高亮器。 |
void setHighlighter(Highlighter) Highlighter getHighlighter() | 设置或获取文本组件使用的高亮器。 |
读取和写入文本
方法 | 描述 |
| void read(Reader, Object) void write(Writer)
(在JTextComponent
中) | 读取或写入文本。 |
| void read(Reader, Document, int) void read(InputStream, Document, int)
(在EditorKit
中) | 从流中读取文本到文档中。 |
| void write(Writer, Document, int, int) void write(OutputStream, Document, int, int)
(在EditorKit
中) | 将文本从文档写入流中。 |
如何使用各种组件
原文:
docs.oracle.com/javase/tutorial/uiswing/components/componentlist.html
每个页面描述了如何使用特定类型的 Swing 组件。
- 如何制作小程序
- 如何使用按钮、复选框和单选按钮
- 如何使用颜色选择器
- 如何使用组合框
- 如何制作对话框
- 如何使用编辑窗格和文本窗格
- 如何使用文件选择器
- 如何使用格式化文本字段
- 如何制作框架(主窗口)
- 如何使用内部框架
- 如何使用标签
- 如何使用分层窗格
- 如何使用列表
- 如何使用菜单
- 如何使用面板
- 如何使用密码字段
- 如何使用进度条
- 如何使用根窗格
- 如何使用滚动窗格
- 如何使用分隔符
- 如何使用滑块
- 如何使用微调器
- 如何使用分割窗格
- 如何使用选项卡窗格
- 如何使用表格
- 如何使用文本区域
- 如何使用文本字段
- 如何使用工具栏
- 如何使用工具提示
- 如何使用树
如何制作 Applets
原文:
docs.oracle.com/javase/tutorial/uiswing/components/applet.html
本节涵盖了JApplet
— 一个使 applets 能够使用 Swing 组件的类。JApplet
是java.applet.Applet
的子类,该类在 Java Applets 教程中有介绍。如果你以前从未编写过常规 applet,我们建议你在继续本节之前阅读该教程。该教程中提供的信息也适用于 Swing applets,但本节会解释一些例外情况。
任何包含 Swing 组件的 applet 必须使用JApplet
的子类来实现。这里是一个帮助 Java 走红的 applet 的 Swing 版本 — 一个动画 applet(在其最著名的配置中)展示了我们的吉祥物 Duke 在做空翻:
//https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TumbleItemProject/TumbleItem.jar’, codebase: ‘https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TumbleItemProject’, code:‘components.TumbleItem’, width:‘600’, height:‘95’ }; var parameters = { permissions:‘sandbox’, nimgs:‘17’, offset:‘-57’, img: ‘images/tumble’, maxwidth:‘120’ }; deployJava.runApplet(attributes, parameters, ‘1.7’); //]]>
注意: 如果你看不到 applet 运行,你需要安装至少Java SE Development Kit (JDK) 7版本。
你可以在TumbleItem.java
中找到这个 applet 的主要源代码。
本节讨论以下主题:
- JApplet 提供的功能
- Applets 中的线程
- 在 Swing Applet 中使用图像
- 在 HTML 页面中嵌入 Applet
- JApplet API
- Applet 示例
JApplet
提供的功能
因为JApplet
是一个顶层的 Swing 容器,每个 Swing applet 都有一个根窗格。根窗格存在的最明显效果是支持添加菜单栏和需要使用内容窗格。
如使用顶层容器中所述,每个顶层容器(如JApplet
)都有一个内容窗格。内容窗格使得 Swing applets 与常规 applets 有以下不同之处:
- 你将组件添加到 Swing applet 的内容窗格,而不是直接添加到 applet。向内容窗格添加组件展示了如何操作。
- 你在 Swing applet 的内容窗格上设置布局管理器,而不是直接在 applet 上设置。
- Swing applet 的内容窗格的默认布局管理器是
BorderLayout
。这与Applet
的默认布局管理器FlowLayout
不同。 - 您不应该直接在
JApplet
对象中放置绘图代码。请参考执行自定义绘图了解如何在小程序中执行自定义绘图的示例。
小程序中的线程
Swing 组件应该在事件分派线程上创建、查询和操作,但浏览器不会从该线程调用小程序的“里程碑”方法。因此,“里程碑”方法——init
、start
、stop
和destroy
应该使用SwingUtilities
方法invokeAndWait
(或者如果适用,invokeLater
),以便引用 Swing 组件的代码在事件分派线程上执行。有关这些方法和事件分派线程的更多信息,请参考 Swing 中的并发。
这里是一个init
方法的示例:
public void init() { //Execute a job on the event-dispatching thread: //creating this applet's GUI. try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't successfully complete"); } } private void createGUI() { JLabel label = new JLabel( "You are successfully running a Swing applet!"); label.setHorizontalAlignment(JLabel.CENTER); label.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black)); getContentPane().add(label, BorderLayout.CENTER); }
invokeLater
方法不适用于这个实现,因为它允许init
在初始化完成之前返回,这可能会导致难以调试的小程序问题。
TumbleItem
中的init
方法更复杂,如下面的代码所示。与第一个示例一样,这个init
方法的实现使用SwingUtilities.invokeAndWait
在事件分派线程上执行 GUI 创建代码。这个init
方法设置了一个 Swing 定时器来触发动画更新的动作事件。此外,init
使用javax.swing.SwingWorker
创建一个后台任务,加载动画图像文件,让小程序立即呈现 GUI,而不必等待所有资源加载完毕。
private void createGUI() { ... animator = new Animator(); animator.setOpaque(true); animator.setBackground(Color.white); setContentPane(animator); ... } public void init() { loadAppletParameters(); //Execute a job on the event-dispatching thread: //creating this applet's GUI. try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't successfully complete"); } //Set up the timer that will perform the animation. timer = new javax.swing.Timer(speed, this); timer.setInitialDelay(pause); timer.setCoalesce(false); timer.start(); //Start the animation. //Background task for loading images. SwingWorker worker = (new SwingWorker<ImageIcon[], Object>() { public ImageIcon[] doInBackground() { final ImageIcon[] innerImgs = new ImageIcon[nimgs]; *...//Load all the images...* return imgs; } public void done() { //Remove the "Loading images" label. animator.removeAll(); loopslot = -1; try { imgs = get(); } *...//Handle possible exceptions* } }).execute(); }
您可以在TumbleItem.java
中找到小程序的源代码。要找到小程序所需的所有文件,请参阅示例索引。
在 Swing 小程序中使用图像
Applet
类提供了getImage
方法来将图片加载到小程序中。getImage
方法创建并返回一个代表加载图片的Image
对象。因为 Swing 组件使用Icon
而不是Image
来引用图片,所以 Swing 小程序往往不使用getImage
。相反,Swing 小程序创建ImageIcon
的实例,从图像文件加载图标。ImageIcon
具有一个节省代码的好处:它自动处理图像跟踪。更多信息请参考如何使用图标。
Duke 做空翻的动画需要 17 张不同的图片。该小程序使用每张图片一个ImageIcon
,并在其init
方法中加载这些图片。由于图片加载可能需要很长时间,这些图标是在一个SwingWorker
对象实现的单独线程中加载的。以下是代码:
public void init() { ... imgs = new ImageIcon[nimgs]; (new SwingWorker<ImageIcon[], Object>() { public ImageIcon[] doInBackground() { //Images are numbered 1 to nimgs, //but fill array from 0 to nimgs-1. for (int i = 0; i < nimgs; i++) { imgs[i] = loadImage(i+1); } return imgs; } ... }).execute(); } ... protected ImageIcon loadImage(int imageNum) { String path = dir + "/T" + imageNum + ".gif"; int MAX_IMAGE_SIZE = 2400; //Change this to the size of //your biggest image, in bytes. int count = 0; BufferedInputStream imgStream = new BufferedInputStream( this.getClass().getResourceAsStream(path)); if (imgStream != null) { byte buf[] = new byte[MAX_IMAGE_SIZE]; try { count = imgStream.read(buf); imgStream.close(); } catch (java.io.IOException ioe) { System.err.println("Couldn't read stream from file: " + path); return null; } if (count <= 0) { System.err.println("Empty file: " + path); return null; } return new ImageIcon(Toolkit.getDefaultToolkit().createImage(buf)); } else { System.err.println("Couldn't find file: " + path); return null; } }
loadImage
方法为指定的动画帧加载图像。它使用 getResourceAsStream
方法而不是通常的 getResource
方法来获取图像。生成的代码不太美观,但是对于从 JAR 文件加载图像到使用 Java Plug-in™ 软件执行的小程序来说,getResourceAsStream
比 getResource
更有效。有关更多详细信息,请参见将图像加载到小程序中。
在 HTML 页面中嵌入小程序
您可以使用 applet
标签部署一个简单的小程序。或者,您可以使用部署工具包。以下是翻筋斗的杜克小程序的代码:
<script src="https://www.java.com/js/deployJava.js" type="text/javascript"> </script><script type="text/javascript"> //<![CDATA[ var attributes = { archive: 'https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TumbleItemProject/TumbleItem.jar', codebase: 'https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TumbleItemProject', code:'components.TumbleItem', width:'600', height:'95' }; var parameters = { permissions:'sandbox', nimgs:'17', offset:'-57', img: 'images/tumble', maxwidth:'120' }; deployJava.runApplet(attributes, parameters, '1.7'); //]]> </script><noscript>A browser with Javascript enabled is required for this page to operate properly.</noscript>
有关更多信息,请参见部署小程序中的 Java 小程序课程。
小程序 JApplet API
下表列出了 JApplet
添加到小程序 API 中的有趣方法。它们让您访问根窗格提供的功能。您可能使用的其他方法由 Component
和 Applet
类定义。请参见组件方法以获取常用的 Component
方法列表,并参见 Java 小程序以获取有关使用 Applet
方法的帮助。
方法 | 目的 |
void setContentPane(Container) Container getContentPane() | 设置或获取小程序的内容窗格。内容窗格包含小程序的可见 GUI 组件,应该是不透明的。 |
void setRootPane(JRootPane) JRootPane getRootPane() | 创建、设置或获取小程序的根窗格。根窗格管理小程序的内部,包括内容窗格、玻璃窗格等。 |
void setJMenuBar(JMenuBar) JMenuBar getJMenuBar() | 设置或获取小程序的菜单栏以管理小程序的一组菜单。 |
void setGlassPane(Component) Component getGlassPane() | 设置或获取小程序的玻璃窗格。您可以使用玻璃窗格拦截鼠标事件。 |
void setLayeredPane(JLayeredPane) JLayeredPane getLayeredPane() | 设置或获取 applet 的分层窗格。您可以使用 applet 的分层窗格将组件放在其他组件的前面或后面。 |
Applet 示例
这个表格展示了 Swing applet 的示例以及这些示例在哪里描述。
示例 | 描述位置 | 备注 |
TumbleItem |
本页 | 一个动画 applet |
如何使用按钮、复选框和单选按钮
原文:
docs.oracle.com/javase/tutorial/uiswing/components/button.html
要创建一个按钮,你可以实例化从AbstractButton
类继承的许多类之一。下表显示了你可能想要使用的 Swing 定义的AbstractButton
子类:
类 | 摘要 | 描述位置 |
JButton |
一个常见的按钮。 | 如何使用通用按钮 API 和 如何使用 JButton 功能 |
JCheckBox |
一个复选框按钮。 | 如何使用复选框 |
JRadioButton |
一组单选按钮中的一个。 | 如何使用单选按钮 |
JMenuItem |
菜单中的一个项目。 | 如何使用菜单 |
JCheckBoxMenuItem |
具有复选框的菜单项。 | 如何使用菜单 和 如何使用复选框 |
JRadioButtonMenuItem |
具有单选按钮的菜单项。 | 如何使用菜单 和 如何使用单选按钮 |
JToggleButton |
实现JCheckBox 和JRadioButton 继承的切换功能。可以实例化或子类化以创建两状态按钮。 |
在一些示例中使用 |
注意: 如果你想将一组按钮收集到一行或一列中,那么你应该查看工具栏。
首先,本节解释了AbstractButton
定义的基本按钮 API,因此所有 Swing 按钮都具有共同的特性。接下来,它描述了JButton
添加到AbstractButton
的少量 API。之后,本节将向您展示如何使用专门的 API 来实现复选框和单选按钮。
如何使用通用按钮 API
这里是一个显示三个按钮的应用程序的图片:
试试这个:
- 点击“启动”按钮以使用Java™ Web Start运行按钮演示(下载 JDK 7 或更高版本)。或者,要自行编译和运行示例,请参考示例索引。
- 点击左侧按钮。
它禁用了中间按钮(以及自身,因为它不再有用),并启用了右侧按钮。 - 点击右侧按钮。
它启用了中间按钮和左侧按钮,并禁用了自身。
正如ButtonDemo
示例所示,Swing 按钮可以同时显示文本和图像。在ButtonDemo
中,每个按钮的文本相对于其图像有不同的位置。每个按钮文本中的下划线字母显示了助记符 — 每个按钮的键盘替代键。在大多数外观中,用户可以通过按下 Alt 键和助记符来点击按钮。例如,Alt-M 将点击 ButtonDemo 中的 Middle 按钮。
当按钮被禁用时,外观会自动生成按钮的禁用外观。但是,您可以提供一个图像来替换正常图像。例如,您可以提供左侧和右侧按钮使用的图像的灰色版本。
如何实现事件处理取决于您使用的按钮类型以及如何使用它。通常,您会实现一个 action listener,每当用户点击按钮时都会通知它。对于复选框,通常会使用一个 item listener,当复选框被选中或取消选中时会通知它。
下面是ButtonDemo.java
中创建上一个示例中按钮并响应按钮点击的代码。粗体代码是如果按钮没有图像时将保留的代码。
*//In initialization code:* ImageIcon leftButtonIcon = createImageIcon("images/right.gif"); ImageIcon middleButtonIcon = createImageIcon("images/middle.gif"); ImageIcon rightButtonIcon = createImageIcon("images/left.gif"); b1 = new JButton("Disable middle button", leftButtonIcon); b1.setVerticalTextPosition(AbstractButton.CENTER); b1.setHorizontalTextPosition(AbstractButton.LEADING); //aka LEFT, for left-to-right locales b1.setMnemonic(KeyEvent.VK_D); b1.setActionCommand("disable"); b2 = new JButton("Middle button", middleButtonIcon); b2.setVerticalTextPosition(AbstractButton.BOTTOM); b2.setHorizontalTextPosition(AbstractButton.CENTER); b2.setMnemonic(KeyEvent.VK_M); b3 = new JButton("Enable middle button", rightButtonIcon); //Use the default text position of CENTER, TRAILING (RIGHT). b3.setMnemonic(KeyEvent.VK_E); b3.setActionCommand("enable"); b3.setEnabled(false); //Listen for actions on buttons 1 and 3. b1.addActionListener(this); b3.addActionListener(this); b1.setToolTipText("Click this button to disable " + "the middle button."); b2.setToolTipText("This middle button does nothing " + "when you click it."); b3.setToolTipText("Click this button to enable the " + "middle button."); ... } public void actionPerformed(ActionEvent e) { if ("disable".equals(e.getActionCommand())) { b2.setEnabled(false); b1.setEnabled(false); b3.setEnabled(true); } else { b2.setEnabled(true); b1.setEnabled(true); b3.setEnabled(false); } } protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = ButtonDemo.class.getResource(path); *...//error handling omitted for clarity...* return new ImageIcon(imgURL); }
Java 中文官方教程 2022 版(十五)(2)https://developer.aliyun.com/article/1486398