活动介绍

JavaSwing高级组件:功能与应用详解

立即解锁
发布时间: 2025-08-18 00:08:26 阅读量: 1 订阅数: 9
### Java Swing高级组件:功能与应用详解 #### 1. 数据操作与文本组件 在数据处理方面,有一些基本的操作方法,例如在指定索引行添加一行数据。同时,还提供了移除指定行以及移动行的功能,具体方法如下: - `adds a row of data at index row`:在指定索引行添加一行数据。 - `void removeRow(int row)`:从模型中移除指定行。 - `void moveRow(int start, int end, int to)`:将索引在`start`和`end`之间的所有行移动到从`to`开始的新位置。 在文本组件方面,除了常见的`JTextField`和`JTextArea`用于获取用户文本输入外,`JEditorPane`是一个非常有用的类,它可以显示和编辑HTML和RTF格式的文本。不过,RTF格式文档记录不完善,不同微软应用之间兼容性也不佳,这里不做过多介绍。目前,`JEditorPane`存在一定局限性,其HTML渲染器只能显示简单文件,对复杂网页处理能力有限,HTML编辑器也不稳定。但它非常适合用于以HTML格式显示程序帮助文档,因为开发者可以控制帮助文件内容,避开`JEditorPane`显示效果不佳的特性。 以下是一个简单的`JEditorPane`示例程序: ```java import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; /** * This program demonstrates how to display HTML document * in an editor pane. */ public class EditorPaneTest { public static void main(String[] args) { JFrame frame = new EditorPaneFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); } } /** * This frame contains an editor pane, a text field and b * to enter a URL and load a document, and a Back button * return to a previously loaded document. */ class EditorPaneFrame extends JFrame { public EditorPaneFrame() { setTitle("EditorPaneTest"); setSize(WIDTH, HEIGHT); final Stack urlStack = new Stack(); final JEditorPane editorPane = new JEditorPane(); final JTextField url = new JTextField(30); // set up hyperlink listener editorPane.setEditable(false); editorPane.addHyperlinkListener(new HyperlinkListener() { public void hyperlinkUpdate(HyperlinkEvent event) { if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { try { // remember URL for back button urlStack.push(event.getURL().toString()); // show URL in text field url.setText(event.getURL().toString()); editorPane.setPage(event.getURL()); } catch(IOException e) { editorPane.setText("Exception: " + e); } } } }); // set up checkbox for toggling edit mode final JCheckBox editable = new JCheckBox(); editable.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { editorPane.setEditable(editable.isSelected()); } }); // set up load button for loading URL ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { try { // remember URL for back button urlStack.push(url.getText()); editorPane.setPage(url.getText()); } catch(IOException e) { editorPane.setText("Exception: " + e); } } }; JButton loadButton = new JButton("Load"); loadButton.addActionListener(listener); url.addActionListener(listener); // set up back button and button action JButton backButton = new JButton("Back"); backButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { if (urlStack.size() <= 1) return; try { // get URL from back button urlStack.pop(); // show URL in text field String urlString = (String)urlStack.peek(); url.setText(urlString); editorPane.setPage(urlString); } catch(IOException e) { editorPane.setText("Exception: " + e); } } }); Container contentPane = getContentPane(); contentPane.add(new JScrollPane(editorPane), BorderLayout.CENTER); // put all control components in a panel JPanel panel = new JPanel(); panel.add(new JLabel("URL")); panel.add(url); panel.add(loadButton); panel.add(backButton); panel.add(new JLabel("Editable")); panel.add(editable); contentPane.add(panel, BorderLayout.SOUTH); } private static final int WIDTH = 600; private static final int HEIGHT = 400; } ``` 这个示例程序展示了如何使用`JEditorPane`显示HTML页面。用户可以在文本框中输入以`http:`或`file:`开头的URL,点击“Load”按钮加载页面,点击超链接可加载新页面,“Back”按钮可返回上一页。若勾选“Editable”复选框,编辑器面板可编辑,支持基本的文本输入和删除操作,以及复制、粘贴快捷键。但要添加字体和格式支持,还需要进行额外编程。 在使用`JEditorPane`时,有一些重要的方法和注意事项: - `setPage(URL url)`:从指定URL加载页面到编辑器面板。 - `addHyperlinkListener(HyperLinkListener listener)`:为编辑器面板添加超链接监听器。 - 默认情况下,`JEditorPane`处于编辑模式,可调用`editorPane.setEditable(false)`关闭编辑模式。 #### 2. 组件组织者 为了更好地组织其他组件,有几种非常实用的组件,包括分割面板、选项卡面板和桌面面板。 ##### 2.1 分割面板(Split Panes) 分割面板用于将一个组件分割成两部分,中间有可调整的边界。可以通过指定分割方向(`JSplitPane.HORIZONTAL_SPLIT`或`JSplitPane.VERTICAL_SPLIT`)和两个组件来创建分割面板。例如: ```java JSplitPane innerPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, planetList, planetImage); ``` 分割面板还支持一些实用的特性: - `setOneTouchExpandable(true)`:添加“一键展开”图标,点击图标可将分割条移动到尽头,完全展开其中一个面板。 - `setContinuousLayout(true)`:开启“连续布局”特性,用户调整分割条时,两个组件内容会持续重绘,但可能会影响性能。 以下是一个分割面板的示例程序: ```java import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; /** * This program demonstrates the split pane component organizer. */ public class SplitPaneTest { public static void main(String[] args) { JFrame frame = new SplitPaneFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); } } /** * This frame consists of two nested split panes to demon * planet images and data. */ class SplitPaneFrame extends JFrame { public SplitPaneFrame() { setTitle("SplitPaneTest"); setSize(WIDTH, HEIGHT); // set up components for planet names, images, desc final JList planetList = new JList(planets); final JLabel planetImage = new JLabel(); final JTextArea description = new JTextArea(); planetList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { Planet value = (Planet)planetList.getSelectedValue(); // update image and description planetImage.setIcon(value.getImage()); description.setText(value.getDescription()); } }); // set up split panes JSplitPane innerPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, planetList, planetImage); innerPane.setContinuousLayout(true); innerPane.setOneTouchExpandable(true); JSplitPane outerPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, innerPane, description); getContentPane().add(outerPane, "Center"); } private Planet[] planets = { new Planet("Mercury", 2440, 0), new Planet("Venus", 6052, 0), new Planet("Earth", 6378, 1), new Planet("Mars", 3397, 2), new Planet("Jupiter", 71492, 16), new Planet("Saturn", 60268, 18), new Planet("Uranus", 25559, 17), new Planet("Neptune", 24766, 8), new Planet("Pluto", 1137, 1) }; private static final int WIDTH = 300; private static final int HEIGHT = 200; } /** * Describes a planet. */ class Planet { /** * Constructs a planet. * @param n the planet name * @param r the planet radius * @param m the number of moons */ public Planet(String n, double r, int m) { name = n; radius = r; moons = m; image = new ImageIcon(name + ".gif"); } public String toString() { return name; } /** * Gets a description of the planet. * @return the description */ public String getDescription() { return "Radius: " + radius + "\nMoons: " + moons; } /** * Gets an image of the planet. * @return the image */ public ImageIcon getImage() { return image; } private String name; private double radius; private int moons; private ImageIcon image; } ``` 这个示例程序创建了一个包含两个嵌套分割面板的窗口,用户可选择行星列表中的行星,右侧显示行星图片,底部显示行星描述。用户可以调整分割条,体验“一键展开”和“连续布局”特性。 分割面板的创建方法有多种重载形式: - `JSplitPane()` - `JSplitPane(int direction)` - `JSplitPane(int direction, boolean continuousLayout)` - `JSplitPane(int direction, Component first, Component second)` - `JSplitPane(int direction, boolean continuousLayout, Component first, Component second)` 同时,还有一些用于获取和设置属性的方法: - `isOneTouchExpandable()`和`setOneTouchExpandable(boolean b)`:获取和设置“一键展开”属性。 - `isContinuousLayout()`和`setContinuousLayout(boolean b)`:获取和设置“连续布局”属性。 - `setLeftComponent(Component c)`和`setTopComponent(Component c)`:设置分割面板的第一个组件。 - `setRightComponent(Component c)`和`setBottomComponent(Component c)`:设置分割面板的第二个组件。 ##### 2.2 选项卡面板(Tabbed Panes) 选项卡面板是一种常见的用户界面组件,用于将复杂对话框拆分为相关选项子集,也可让用户切换一组文档或图像。创建选项卡面板的步骤如下: 1. 创建`JTabbedPane`对象。 2. 使用`addTab`方法添加选项卡,可指定标题、图标和组件。例如: ```java JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab(title, icon, component); ``` 3. 若要在选项卡集合中间插入选项卡,可使用`insertTab`方法;移除选项卡使用`removeTabAt`方法。 4. 添加新选项卡后,需调用`setSelectedIndex`方法选择要显示的选项卡。 如果选项卡较多,可通过`setTabLayoutPolicy`方法设置选项卡布局为包裹或滚动模式: - `tabbedPane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT)` - `tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT)` 以下是一个选项卡面板的示例程序: ```java import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; /** * This program demonstrates the tabbed pane component organizer. */ public class TabbedPaneTest { public static void main(String[] args) { JFrame frame = new TabbedPaneFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); } } /** * This frame shows a tabbed pane and radio buttons to * switch between wrapped and scrolling tab layout. */ class TabbedPaneFrame extends JFrame { public TabbedPaneFrame() { setTitle("TabbedPaneTest"); setSize(WIDTH, HEIGHT); final JTabbedPane tabbedPane = new JTabbedPane(); // we set the components to null and delay their // loading until the tab is shown for the first time ImageIcon icon = new ImageIcon("yellow-ball.gif"); tabbedPane.addTab("Mercury", icon, null); tabbedPane.addTab("Venus", icon, null); tabbedPane.addTab("Earth", icon, null); tabbedPane.addTab("Mars", icon, null); tabbedPane.addTab("Jupiter", icon, null); tabbedPane.addTab("Saturn", icon, null); tabbedPane.addTab("Uranus", icon, null); tabbedPane.addTab("Neptune", icon, null); tabbedPane.addTab("Pluto", icon, null); getContentPane().add(tabbedPane, "Center"); tabbedPane.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent event) { // check if this tab still has a null component if (tabbedPane.getSelectedComponent() == null) { // set the component to the image icon int n = tabbedPane.getSelectedIndex(); String title = tabbedPane.getTitleAt(n); ImageIcon planetIcon = new ImageIcon(title + ".gif"); tabbe ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

Clojure多方法:定义、应用与使用场景

### Clojure 多方法:定义、应用与使用场景 #### 1. 定义多方法 在 Clojure 中,定义多方法可以使用 `defmulti` 函数,其基本语法如下: ```clojure (defmulti name dispatch-fn) ``` 其中,`name` 是新多方法的名称,Clojure 会将 `dispatch-fn` 应用于方法参数,以选择多方法的特定实现。 以 `my-print` 为例,它接受一个参数,即要打印的内容,我们希望根据该参数的类型选择特定的实现。因此,`dispatch-fn` 需要是一个接受一个参数并返回该参数类型的函数。Clojure 内置的

在线票务系统解析:功能、流程与架构

### 在线票务系统解析:功能、流程与架构 在当今数字化时代,在线票务系统为观众提供了便捷的购票途径。本文将详细解析一个在线票务系统的各项特性,包括系统假设、范围限制、交付计划、用户界面等方面的内容。 #### 系统假设与范围限制 - **系统假设** - **Cookie 接受情况**:互联网用户不强制接受 Cookie,但预计大多数用户会接受。 - **座位类型与价格**:每场演出的座位分为一种或多种类型,如高级预留座。座位类型划分与演出相关,而非个别场次。同一演出同一类型的座位价格相同,但不同场次的价格结构可能不同,例如日场可能比晚场便宜以吸引家庭观众。 -

响应式Spring开发:从错误处理到路由配置

### 响应式Spring开发:从错误处理到路由配置 #### 1. Reactor错误处理方法 在响应式编程中,错误处理是至关重要的。Project Reactor为其响应式类型(Mono<T> 和 Flux<T>)提供了六种错误处理方法,下面为你详细介绍: | 方法 | 描述 | 版本 | | --- | --- | --- | | onErrorReturn(..) | 声明一个默认值,当处理器中抛出异常时发出该值,不影响数据流,异常元素用默认值代替,后续元素正常处理。 | 1. 接收要返回的值作为参数<br>2. 接收要返回的值和应返回默认值的异常类型作为参数<br>3. 接收要返回

并发编程:多语言实践与策略选择

### 并发编程:多语言实践与策略选择 #### 1. 文件大小计算的并发实现 在并发计算文件大小的场景中,我们可以采用数据流式方法。具体操作如下: - 创建两个 `DataFlowQueue` 实例,一个用于记录活跃的文件访问,另一个用于接收文件和子目录的大小。 - 创建一个 `DefaultPGroup` 来在线程池中运行任务。 ```plaintext graph LR A[创建 DataFlowQueue 实例] --> B[创建 DefaultPGroup] B --> C[执行 findSize 方法] C --> D[执行 findTotalFileS

编程中的数组应用与实践

### 编程中的数组应用与实践 在编程领域,数组是一种非常重要的数据结构,它可以帮助我们高效地存储和处理大量数据。本文将通过几个具体的示例,详细介绍数组在编程中的应用,包括图形绘制、随机数填充以及用户输入处理等方面。 #### 1. 绘制数组图形 首先,我们来创建一个程序,用于绘制存储在 `temperatures` 数组中的值的图形。具体操作步骤如下: 1. **创建新程序**:选择 `File > New` 开始一个新程序,并将其保存为 `GraphTemps`。 2. **定义数组和画布大小**:定义一个 `temperatures` 数组,并设置画布大小为 250 像素×250 像

Hibernate:从基础使用到社区贡献的全面指南

# Hibernate:从基础使用到社区贡献的全面指南 ## 1. Hibernate拦截器基础 ### 1.1 拦截器代码示例 在Hibernate中,拦截器可以对对象的加载、保存等操作进行拦截和处理。以下是一个简单的拦截器代码示例: ```java Type[] types) { if ( entity instanceof Inquire) { obj.flushDirty(); return true; } return false; } public boolean onLoad(Object obj, Serial

JavaEE7中的MVC模式及其他重要模式解析

### Java EE 7中的MVC模式及其他重要模式解析 #### 1. MVC模式在Java EE中的实现 MVC(Model-View-Controller)模式是一种广泛应用于Web应用程序的设计模式,它将视图逻辑与业务逻辑分离,带来了灵活、可适应的Web应用,并且允许应用的不同部分几乎独立开发。 在Java EE中实现MVC模式,传统方式需要编写控制器逻辑、将URL映射到控制器类,还需编写大量的基础代码。但在Java EE的最新版本中,许多基础代码已被封装好,开发者只需专注于视图和模型,FacesServlet会处理控制器的实现。 ##### 1.1 FacesServlet的

AWSLambda冷启动问题全解析

### AWS Lambda 冷启动问题全解析 #### 1. 冷启动概述 在 AWS Lambda 中,冷启动是指函数实例首次创建时所经历的一系列初始化步骤。一旦函数实例创建完成,在其生命周期内不会再次经历冷启动。如果在代码中添加构造函数或静态初始化器,它们仅会在函数冷启动时被调用。可以在处理程序类的构造函数中添加显式日志,以便在函数日志中查看冷启动的发生情况。此外,还可以使用 X-Ray 和一些第三方 Lambda 监控工具来识别冷启动。 #### 2. 冷启动的影响 冷启动通常会导致事件处理出现延迟峰值,这也是人们关注冷启动的主要原因。一般情况下,小型 Lambda 函数的端到端延迟

设计与实现RESTfulAPI全解析

### 设计与实现 RESTful API 全解析 #### 1. RESTful API 设计基础 ##### 1.1 资源名称使用复数 资源名称应使用复数形式,因为它们代表数据集合。例如,“users” 代表用户集合,“posts” 代表帖子集合。通常情况下,复数名词表示服务中的一个集合,而 ID 则指向该集合中的一个实例。只有在整个应用程序中该数据类型只有一个实例时,使用单数名词才是合理的,但这种情况非常少见。 ##### 1.2 HTTP 方法 在超文本传输协议 1.1 中定义了八种 HTTP 方法,但在设计 RESTful API 时,通常只使用四种:GET、POST、PUT 和

ApacheThrift在脚本语言中的应用

### Apache Thrift在脚本语言中的应用 #### 1. Apache Thrift与PHP 在使用Apache Thrift和PHP时,首先要构建I/O栈。以下是构建I/O栈并调用服务的基本步骤: 1. 将传输缓冲区包装在二进制协议中,然后传递给服务客户端的构造函数。 2. 构建好I/O栈后,打开套接字连接,调用服务,最后关闭连接。 示例代码中的异常捕获块仅捕获Apache Thrift异常,并将其显示在Web服务器的错误日志中。 PHP错误通常在Web服务器的上下文中在服务器端表现出来。调试PHP程序的基本方法是检查Web服务器的错误日志。在Ubuntu 16.04系统中