Swing组件进阶:文本组件与树的深入探索
立即解锁
发布时间: 2025-08-19 00:30:37 阅读量: 2 订阅数: 8 


Java编程入门与实践指南
### Swing组件进阶:文本组件与树的深入探索
在Java的Swing库中,有许多强大的组件可用于构建丰富的用户界面。本文将深入介绍Swing的文本组件和树组件,包括它们的基本使用、高级特性以及实际应用示例。
#### 1. 文本组件
Swing提供了多种文本组件,从简单的文本输入框到复杂的HTML解释器。下面我们将逐一介绍这些组件。
##### 1.1 基本文本组件
- **JTextArea**:多行文本编辑器。
- **JTextField**:单行文本编辑器。
这两个组件都继承自JTextComponent类,因此具有一些共同的功能,如设置和获取显示文本、指定文本是否可编辑、操作光标位置和文本选择等。
观察文本组件的变化需要理解它们如何实现Model - View - Controller(MVC)架构。文本组件的数据模型是一个名为Document的对象。当你在JTextField或JTextArea中添加或删除文本时,相应的Document会发生变化。当文本发生变化时,是Document本身而不是可视化组件生成文本事件。以下是一个监听JTextArea变化的示例:
```java
JTextArea textArea = new JTextArea( );
Document d = textArea.getDocument( );
d.addDocumentListener(someListener);
```
此外,当用户在JTextField中按下回车键时,会生成一个ActionEvent。要获取这些事件,需要实现ActionListener接口并调用addActionListener()进行注册。
##### 1.2 文本输入框应用示例:TextEntryBox
以下是一个简单的TextEntryBox应用示例,它将JTextField和JTextArea结合使用:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextEntryBox extends JFrame {
public TextEntryBox( ) {
super("TextEntryBox v1.0");
setSize(200, 300);
setLocation(200, 200);
final JTextArea area = new JTextArea( );
area.setFont(new Font("Serif", Font.BOLD, 18));
area.setText("Howdy!\n");
final JTextField field = new JTextField( );
Container content = getContentPane( );
content.add(new JScrollPane(area), BorderLayout.CENTER);
content.add(field, BorderLayout.SOUTH);
setVisible(true);
field.requestFocus( );
field.addActionListener(new ActionListener( ) {
public void actionPerformed(ActionEvent ae) {
area.append(field.getText( ) + '\n');
field.setText("");
}
});
}
public static void main(String[] args) {
JFrame f = new TextEntryBox( );
f.addWindowListener(new WindowAdapter( ) {
public void windowClosing(WindowEvent we) { System.exit(0); }
});
f.setVisible(true);
}
}
```
在这个示例中,当用户在JTextField中按下回车键时,输入的文本会被添加到JTextArea中,并且JTextField会被清空。
##### 1.3 密码输入框:JPasswordField
JPasswordField用于输入密码,它的行为类似于JTextField,但输入的字符会被替换为一个字符,通常是星号。以下是一些使用JPasswordField的注意事项:
- 可以使用setEchoChar()方法指定显示的字符。
- 建议使用getPassword()方法获取输入的密码,而不是getText()方法,因为getPassword()返回的是字符数组,更安全。
##### 1.4 共享数据模型
可以让多个文本组件共享同一个Document,这样当一个文本组件中的文本发生变化时,其他组件也会相应更新。以下是一个示例:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SharedModel extends JFrame {
public SharedModel( ) {
super("SharedModel v1.0");
setSize(300, 300);
setLocation(200, 200);
JTextArea areaFiftyOne = new JTextArea( );
JTextArea areaFiftyTwo = new JTextArea( );
areaFiftyTwo.setDocument(areaFiftyOne.getDocument( ));
JTextArea areaFiftyThree = new JTextArea( );
areaFiftyThree.setDocument(areaFiftyOne.getDocument( ));
Container content = getContentPane( );
content.setLayout(new GridLayout(3, 1));
content.add(new JScrollPane(areaFiftyOne));
content.add(new JScrollPane(areaFiftyTwo));
content.add(new JScrollPane(areaFiftyThree));
setVisible(true);
}
public static void main(String[] args) {
JFrame f = new SharedModel( );
f.addWindowListener(new WindowAdapter( ) {
public void windowClosing(WindowEvent we) { System.exit(0); }
});
f.setVisible(true);
}
}
```
这个示例中,三个JTextArea共享同一个Document,当在其中一个文本区域输入文本时,其他两个区域也会显示相同的文本。
##### 1.5 HTML和RTF显示:JEditorPane
JEditorPane可以显示HTML和RTF文档,并且会触发HyperlinkEvent。以下是一个简单的浏览器示例:
```java
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;
public class CanisMinor extends JFrame {
protected JEditorPane mEditorPane;
protected JTextField mURLField;
public CanisMinor(String urlString) {
super("CanisMinor v1.0");
createUI(urlString);
setVisible(true);
}
protected void createUI(String urlString) {
setSize(500, 600);
center( );
Container content = getContentPane( );
content.setLayout(new BorderLayout( ));
// add the URL control
JToolBar urlToolBar = new JToolBar( );
mURLField = new JTextField(urlString, 40);
urlToolBar.add(new JLabel("Location:"));
urlToolBar.add(mURLField);
content.add(u
```
0
0
复制全文
相关推荐










