① java编程采用图形界面实现两个内容的交换,图形界面如下图
以下是一个简单的Java GUI程序,可以实现两个内容(字符串、图片等)之间的交换:
Copy code
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SwapContent extends JFrame implements ActionListener {
private JLabel label1, label2;
private JButton swapBtn;
public SwapContent() {
// 设置窗口大小和标题
setSize(400, 300);
setTitle("Swap Content Demo");
// 创建标签和按钮模唤
label1 = new JLabel("Content A");
label2 = new JLabel("Content B");
swapBtn = new JButton("Swap");
// 设置标签和按钮的位置和大小
label1.setBounds(50, 50, 100, 30);
label2.setBounds(200, 50, 100, 30);
swapBtn.setBounds(150, 150, 100, 30);
// 将标签和按钮添加到窗口中
add(label1);
add(label2);
add(swapBtn);
// 注册按钮的事件监听器
swapBtn.addActionListener(this);
// 设置窗口的默认关闭方式
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
// 获取标签的内容
String temp = label1.getText();
label1.setText(label2.getText());
label2.setText(temp);
}
public static void main(String[] args) {
// 创建窗口对象并显示
SwapContent sc = new SwapContent();
sc.setVisible(true);
}
}
该程序创建了一个窗口,包括两个标签(label1和label2)和一个按钮(swapBtn)。当用户点击按钮时,程序会交换label1和label2的内容。
在程序的actionPerformed方法中,程序将label1和label2的内容交换。具体实现是,首先使用旦册凯label1.getText()获取label1的内容,并将其保存到一个临时变量temp中;然后,将label1的内容设置为label2的内容,将label2的内容设置为temp的姿裂值。这样,label1和label2的内容就被互换了。
在main方法中,程序创建了SwapContent对象,并将其显示出来。程序运行后,用户可以在窗口中交换label1和label2的内容。
② 用Java语言设计一个界面,
首先:采用什么技术实现
java语言可以使用awt 和swing等技术实现图形界面
推荐使用Swing,因为Swing比AWT更专业,更漂亮,组件更丰富,功能更强大。
2. 其次:分析采用什么布局
边界布局BorderLayout,配合表格布局GridLayout,既简单又美观
3. 最后:分析需求中需要用的组件
学生姓名 学号 显示信息 需要用到文本框JTextField
单选按钮 需要用到组件JRadioButton
复选框 需要用到组件JCheckBox
组合框 需要用到组件JComboBox
图片效果
//导入所需要的包
importjava.awt.event.*;
importjavax.swing.border.*;
importjavax.swing.*;
importjava.awt.*;
{//写一个类继承自JFrame窗体
//定义组件
=1L;
privateJPanelcontentPane;
privateJTextFieldtfName,tfNum,allInfo;
privateJRadioButtonrb1,rb2;
privateJCheckBoxcb1,cb2,cb3;
privateJComboBox<String>t1,t2,t3;
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
try{
ClassFrameframe=newClassFrame();//创建一个窗口实例
frame.setVisible(true);//让该窗口实例可见
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
/**
*窗口属性的设置,内部组件的初始化
*/
publicClassFrame(){
setTitle("选课ing...");//标题
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭是退出JVM
setSize(450,339);//设置窗体大小
setLocationRelativeTo(null);//窗体居中
contentPane=newJPanel();//内容面板
contentPane.setBorder(newEmptyBorder(5,5,5,5));
contentPane.setLayout(newBorderLayout(0,0));//设置布局
setContentPane(contentPane);
JPanelpanel=newJPanel(newGridLayout(5,1,5,10));//5行1列的表格布局
panel.setBorder(newTitledBorder(null,"",TitledBorder.LEADING,TitledBorder.TOP,null,null));
contentPane.add(panel,BorderLayout.CENTER);//给panel添加边框
JPanelpanel_1=newJPanel();
panel.add(panel_1);
JLabellabel=newJLabel("姓名");
panel_1.add(label);
tfName=newJTextField();
panel_1.add(tfName);
tfName.setColumns(10);
JLabellabel_2=newJLabel("学号");
panel_1.add(label_2);
tfNum=newJTextField();
tfNum.setColumns(10);
panel_1.add(tfNum);
rb1=newJRadioButton("男");
panel_1.add(rb1);
rb1.setSelected(true);//设置单选按钮中,默认选择的按钮
rb2=newJRadioButton("女");
panel_1.add(rb2);
ButtonGroupbts=newButtonGroup();//单选按钮需要加入同一个ButonGroup中才能生效
bts.add(rb1);
bts.add(rb2);
JPanelpanel_2=newJPanel();
panel.add(panel_2);
cb1=newJCheckBox("高等数学");
panel_2.add(cb1);
t1=newJComboBox<String>();
t1.setModel(newDefaultComboBoxModel<String>(newString[]{"林老师","赵老师","孙老师"}));
panel_2.add(t1);
JPanelpanel_3=newJPanel();
panel.add(panel_3);
cb2=newJCheckBox("世界经济");
panel_3.add(cb2);
t2=newJComboBox<String>();
t2.setModel(newDefaultComboBoxModel<String>(newString[]{"张老师","刘老师"}));
panel_3.add(t2);
JPanelpanel_4=newJPanel();
panel.add(panel_4);
cb3=newJCheckBox("音乐赏析");
panel_4.add(cb3);
t3=newJComboBox<String>();
t3.setModel(newDefaultComboBoxModel<String>(newString[]{"王老师","周老师"}));
panel_4.add(t3);
JPanelpanel_5=newJPanel();
panel.add(panel_5);
JButtonjbOk=newJButton("确定");
panel_5.add(jbOk);
JButtonjbRest=newJButton("重填");
panel_5.add(jbRest);
JPanelpanelSouth=newJPanel();
contentPane.add(panelSouth,BorderLayout.SOUTH);
JLabellabe=newJLabel("选课信息");
labe.setHorizontalAlignment(SwingConstants.LEFT);
panelSouth.add(labe);
allInfo=newJTextField();
allInfo.setColumns(30);
panelSouth.add(allInfo);
JPanelpanelNorth=newJPanel();
contentPane.add(panelNorth,BorderLayout.NORTH);
JLabellabelTitle=newJLabel("学生选课界面");
labelTitle.setForeground(Color.DARK_GRAY);
labelTitle.setFont(newFont("宋体",Font.BOLD,20));
panelNorth.add(labelTitle);
//给确定按钮添加事件处理代码
jbOk.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
StringBuilderinfo=newStringBuilder();
Stringname=tfName.getText();
Stringnum=tfNum.getText();
Stringsex;
if(rb1.isSelected()){
sex="男";
}else{
sex="女";
}
info.append(name+num+sex);
if(cb1.isSelected()){
Stringc=cb1.getText();
Stringt=t1.getSelectedItem().toString();
info.append(""+c+t);
}
if(cb2.isSelected()){
Stringc=cb2.getText();
Stringt=t2.getSelectedItem().toString();
info.append(""+c+t);
}
if(cb3.isSelected()){
Stringc=cb3.getText();
Stringt=t3.getSelectedItem().toString();
info.append(""+c+t);
}
allInfo.setText(info.toString());//把学生信息和选课信息放到文本框
}
});
//给重填按钮设置事件处理代码
jbRest.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
tfName.setText("");
tfNum.setText("");
rb1.setSelected(true);
cb1.setSelected(false);
t1.setSelectedIndex(0);
cb2.setSelected(false);
t2.setSelectedIndex(0);
cb3.setSelected(false);
t3.setSelectedIndex(0);
allInfo.setText("");
}
});
}
}
③ java swing界面设计
GUI图形界面设计的重点是布局
SWING也是采用AWT的布局方式,进行布局管理的。(实现LayoutManager接口的方法,来进行管理布局,API中已有实现类,我们通常只需要指定实现类,而不需要自己重写方法)
常用的布局有绝对布局, 边界布局BorderLayout,流布局FlowLayout,表格布局GridLayout。
JFrame等重量级组件,默认布局是边界布局,JPanel轻量级组件,默认布局是流布局
绝对布局:布局的特点,需要指定每个组件的大小,和具体位置。
优点:充分的自定义,充分的自由,可以写出漂亮的 ,细致的界面
缺点:绝对布局在不同的操作系统下,会有一些不同程度的变化,导致界面变形,甚至组件重叠等。在同一操作系统下,窗口放大缩小,界面也会变形
绝对布局的范例
④ JavaSwing图形界面开发与案例详解的作品目录
第1章JavaSwing概述
1.1什么是JavaSwing
1.1.1Swing的发展史
1.1.2Swing的功能
1.1.3Swing的特性
1.2.1avaSwing的包结构
1.3一个JavaSwing程序实例
1.4本章小结
1.5本章习题
第2章如何使用IDE开发Swing程序
2.1如何利用Eclipse开发Swing程序
2.2如何利用JBuilder开发Swing程序
2.3如何利用NetBeans开发Swing程序
2.4本章小结
2.5本章习题
第3章JavaSwirlg组件基础
3.1Swing组件类的层次
3.2Window类
3.2.1顶层容器类和包含层次
3.2.2在顶层容器中添加组件
3.2.3在顶层容器中添加菜单栏
3.3JComponent类
3.4本章小结
3.5本章习题
第4章如何使用标签和按钮组件
4.1如何使用标签
4.2如何使用按钮
4.2.1如何使用普通按钮
4.2.2如何使用单选按钮
4.2.3如何使用复选框
4.2.4按钮组件的实例应用
4.3本章小结
4.4本章习题
第5章如何使用布局管理器组件
5.1布局管理器概述
5.2布局管理器的种类
5.2.1BorderLayout
5.2.2FlowLayout
5.2.3GridLayout
5.2.4GridBagLayout
5.2.5CardLayout
5.2.6BoxLayout
5.2.7SpringLayout
5.2.8GroupLayout
5.3自定义布局管理器的创建
5.4本章小结
5.5本章习题
第6章如何使用面板组件
6.1如何使用JPanel
6.2如何使用JScrollPane
6.3如何使用JSplitPane
6.4如何使用JTabbedPane
6.5如何使用JIntemalFrame
6.6如何使用JLayeredPane
6.7如何使用JRootPane
6.8本章小结
6.9本章习题
第7章Swirlg事件处理机制
7.1Swing事件处理机制概述
7.2Swing中的监听器
7.2.1事件处理的过程与步骤
7.2.2匿名类方式处理事件
7.2.3适配器类
7.2.4Swing所支持的事件监听器
7.2.5窗口事件的处理
7.2.6动作事件的处理
7.2.7焦点事件的处理
7.3本章小结
7.4本章习题
第8章如何使用列表框和下拉列表框组件
8.1如何使用列表框JList
8.1.1使用数组方式创建列表框
8.1.2使用Vector方式创建列表框
8.1.3使用ListModel方式创建列表框
8.1.4列表框选取事件的处理
8.1.5列表框双击事件的处理
8.2如何使用下拉列表框JComboBox
8.2.1使用数组和Vector创建下拉列表框
8.2.2使用ComboBoxModel创建下拉列表框
8.2.3下拉列表框的事件处理
8.3本章小结
8.4本章习题
第9章如何使用进度条、时间、滑块和分隔条组件
9.1如何使用进度条组件JProgressBar
9.2如何使用时间组件Timer
9.3如何使用滑块组件JSlider
9.4如何使用分隔条组件JSeparator
9.5本章小结
9.6本章习题
第10章如何使用选取器组件
10.1如何使用文件选取器JFileChooser
10.1.1如何创建JFileChooser组件
10.1.2如何创建JFileChooser对话框
10.2如何使用颜色选取器JColorChooser
10.3本章小结
10.4本章习题
第11章如何使用文本组件
11.1文本组件概述
11.2如何使用普通文本组件
11.2.1如何使用JTextField
11.2.2如何使用JPasswordField
11.2.3如何使用JFormattedTextField
11.3如何使用文本区组件
11.4如何打印文本组件
11.5本章小结
11.6本章习题
第12章如何使用窗口、对话框和JApplet组件
12.1如何使用窗口组件
12.2如何使用对话框组件
12.3如何使用JApplet组件
12.4本章小结
12.5本章习题
第13章如何使用菜单和工具条组件
13.1如何使用菜单组件
13.1.1菜单组件的类层次
13.1.2如何创建菜单
13.1.3如何处理菜单事件
13.1.4如何响应键盘操作
13.1.5如何使用弹出式菜单
13.1.6如何使用菜单项的启用和禁用功能
13.1.7如何创建复选框菜单项
13.1.8如何创建单选按钮菜单项
13.1.9如何定义个性化菜单
13.1.10菜单组件的常用API
13.2如何使用工具条组件
13.2.1如何创建工具条
13.2.2如何定义个性化工具条
13.2.3工具条组件的常用API
13.3本章小结
13.4本章习题
第14章如何使用表格组件
14.1如何创建一个表格
14.2如何把表格加入容器
14.3如何设置表格列宽
14.4如何创建表格模型
14.5如何监听数据变化
14.6如何使用选择器
14.7如何使用编辑器和渲染器
14.8如何使用自定义渲染器
14.9如何为单元格指定文字说明
14.10如何为表头指定文字说明
14.11如何使用排序和过滤
14.12如何使用组合框作为编辑器
14.13如何使用其他编辑器
14.14如何使用编辑器验证文本
14.15如何打印表格
14.16本章小结
14.17本章习题
第15章如何使用树组件
15.1如何创建树
15.2如何创建数据模型
15.3如何处理节点事件
15.3.1如何处理TreeModelEvent事件
15.3.2如何处理TreeSelectionEvent事件
15.4如何定义个性化树
15.5树组件的常用API
15.6本章小结
15.7本章习题
第16章如何使用Swing观感器
16.1如何设置程序的观感
16.2如何自定义观感器
16.3本章小结
16.4本章习题
第17章Swing与并发
17.1多线程问题
17.2初始线程
17.3事件分派线程
17.4工作线程
17.4.1简单的背景任务
17.4.2拥有临时结果的任务
17.4.3取消背景任务
17.4.4绑定属性和状态方法
17.5本章小结
17.6本章习题
第18章Swing模型架构
18.1传统的MVC设计模式
18.2可分离的模型架构
18.3本章小结
18.4本章习题
第19章Swing的其他特性
19.1如何在Swing组件中使用HTML
19.2如何使用边框
19.2.1如何使用Swing中的边框
19.2.2如何创建自定义边框
19.2.3边框组件的常用API
19.3如何使用图标
19.4如何使用动作
19.5如何支持辅助技术
19.6如何使用焦点子系统
19.7如何使用键绑定
19.8如何在对话框中使用Modality
19.9如何创建SplashScreen
19.10如何使用SystemTray
19.11如何使用Swing拖曳功能和数据传输
19.12本章小结
19.13本章习题
第20章Swirlg实现通讯录系统
20.1通讯录系统的软件框架
20.2通讯录系统的登录系统
20.3通讯录系统的主菜单系统
20.3.1数据库模块的设计
20.3.2信息界面模块的设计
20.3.3功能模块的设计
20.3.4其他模块的设计
20.3.5TabbedPane容器框架的设计
20.3.6主菜单的设计
20.4本章小结
……
⑤ 关于Java Swing 图形界面的
0. JavaSwing 简介
Java Swing 图形界面开发简介
1. JavaSwing 布局管理器
JavaSwing_1.1: FlowLayout(流式布局)
JavaSwing_1.2: GridLayout(网格布局)
JavaSwing_1.3: GridBagLayout(网格袋布局)
JavaSwing_1.4: BoxLayout(箱式布局)
JavaSwing_1.5: GroupLayout(分组布局)
JavaSwing_1.6: CardLayout(卡片布局)
JavaSwing_1.7: BorderLayout(边界布局)
JavaSwing_1.8: SpringLayout(弹性布局)
JavaSwing_1.9: null(绝对布局)
2. JavaSwing 基本组件
JavaSwing_2.1: JLabel(标签)
JavaSwing_2.2: JButton(按钮)
JavaSwing_2.3: JRadioButton(单选按钮)
JavaSwing_2.4: JCheckBox(复选框)
JavaSwing_2.5: JToggleButton(开关按钮)
JavaSwing_2.6: JTextField(文本框)
JavaSwing_2.7: JPasswordField(密码框)
JavaSwing_2.8: JTextArea(文本区域)
JavaSwing_2.9: JComboBox(下拉列表框)
JavaSwing_2.10: JList(列表框)
JavaSwing_2.11: JProgressBar(进度条)
JavaSwing_2.12: JSlider(滑块)
3. JavaSwing 面板组件
JavaSwing_3.1: JPanel(面板)
JavaSwing_3.2: JScrollPane(滚动面板)
JavaSwing_3.3: JSplitPane(分隔面板)
JavaSwing_3.4: JTabbedPane(选项卡面板)
JavaSwing_3.5: JLayeredPane(层级面板)
4. JavaSwing 其他组件
JavaSwing_4.1: JFrame(窗口)
JavaSwing_4.2: JDialog、JOptionPane(对话框)
JavaSwing_4.3: JFileChooser(文件选择器)
JavaSwing_4.4: JColorChooser(颜色选择器)
JavaSwing_4.5: JMenuBar(菜单栏)
JavaSwing_4.6: JToolBar(工具栏)
JavaSwing_4.7: JPopupMenu(弹出菜单)
JavaSwing_4.8: JTable(表格)
JavaSwing_4.9: JTree(树)
JavaSwing_4.10: JInternalFrame(内部窗口)
5. JavaSwing 相关特性
JavaSwing_5.1: 组件的位置和尺寸
JavaSwing_5.2: 组件边框(Border)
JavaSwing_5.3: 事件处理
JavaSwing_5.4: 多线程并发与线程安全
JavaSwing_5.5: 拖拽功能
JavaSwing_5.6: 系统托盘(System Tray)
JavaSwing_5.7: 闪屏(Splash Screen)
扩展:Java AWT/Swing 其他相关
Java绘图: 使用Graphics类绘制线段、矩形、椭圆/圆弧/扇形、图片、文本
Java图片操作 — 图片的读取、绘制、缩放、裁剪、保存
Java代码截屏:使用 Java 代码截取电脑屏幕并保存
Java模拟鼠标键盘输入事件 — Robot 类
Java操作桌面应用 — Desktop 类
Java操作系统剪贴板(Clipboard)实现复制和粘贴
⑥ java编写一个图形界面程序
importjava.awt.*;
importjava.awt.event.*;
importjava.util.*;
importjavax.swing.*;
importjavax.swing.border.Border;
classMainFrameextendsJFrame{
=1L;
privateMap<String,Integer>sizes=newHashMap<String,Integer>();
privateMap<String,Integer>styles=newHashMap<String,Integer>();
privateMap<String,Integer>toppings=newHashMap<String,Integer>();
publicMainFrame(){
sizes.put("ExtraLarge",10);
sizes.put("Large",8);
sizes.put("Medium",5);
sizes.put("Small",3);
styles.put("DeepDish",20);
styles.put("Regular",10);
styles.put("ThinCrust",5);
styles.put("Chicago",3);
toppings.put("Cheese",8);
toppings.put("Tomato",7);
toppings.put("Peppers",6);
toppings.put("Peperoni",5);
this.setTitle("布局及事件处理");
this.setSize(450,350);
this.setLayout(newBorderLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabellblTitle=newJLabel();
lblTitle.setText("PizzeriaJuno");
lblTitle.setFont(newFont("宋体",Font.BOLD,36));
lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
this.add("North",lblTitle);
JPanelbodyPanel=newJPanel();
bodyPanel.setLayout(newGridLayout(2,1));
this.add("Center",bodyPanel);
JPanellistPanel=newJPanel();
listPanel.setLayout(newGridLayout(1,3));
listPanel.setSize(200,200);
bodyPanel.add(listPanel);
BorderlineBorder=BorderFactory.createLineBorder(Color.BLACK);
JPanelsizePanel=newJPanel();
sizePanel.setLayout(newBorderLayout());
listPanel.add(sizePanel);
JLabelsizeTitle=newJLabel();
sizeTitle.setText("Sizes");
sizePanel.add("North",sizeTitle);
JListsizeList=newJList(sizes.keySet().toArray());
sizeList.setSize(100,100);
sizeList.setBorder(lineBorder);
sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
sizePanel.add(sizeList);
JPanelstylePanel=newJPanel();
stylePanel.setLayout(newBorderLayout());
listPanel.add(stylePanel);
JLabelstyleTitle=newJLabel();
styleTitle.setText("Styles");
stylePanel.add("North",styleTitle);
JListstyleList=newJList(styles.keySet().toArray());
styleList.setSize(100,100);
styleList.setBorder(lineBorder);
styleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
stylePanel.add(styleList);
JPaneltoppingPanel=newJPanel();
toppingPanel.setLayout(newBorderLayout());
listPanel.add(toppingPanel);
JLabeltoppingTitle=newJLabel();
toppingTitle.setText("Toppings");
toppingPanel.add("North",toppingTitle);
JListtoppingList=newJList(toppings.keySet().toArray());
toppingList.setSize(100,100);
toppingList.setBorder(lineBorder);
toppingPanel.add(toppingList);
JTextAreatxtResult=newJTextArea();
txtResult.setEditable(false);
bodyPanel.add(txtResult);
JPanelbottomPanel=newJPanel();
bottomPanel.setLayout(newGridLayout(1,3));
this.add("South",bottomPanel);
JLabellabel1=newJLabel("Clicktocompleteorder");
bottomPanel.add(label1);
JButtonbtnRingUp=newJButton("Ringup");
btnRingUp.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
if(sizeList.getSelectedValue()==null){
JOptionPane.showMessageDialog(MainFrame.this,"Pleaseselectsize.");
return;
}
if(styleList.getSelectedValue()==null){
JOptionPane.showMessageDialog(MainFrame.this,"Pleaseselectstyle.");
return;
}
if(toppingList.getSelectedValue()==null){
JOptionPane.showMessageDialog(MainFrame.this,"Pleaseselecttopping.");
return;
}
floattotal=0;
Stringsize=sizeList.getSelectedValue().toString();
total+=sizes.get(size);
Stringstyle=styleList.getSelectedValue().toString();
total+=styles.get(style);
Stringresult=size+"Pizza,"+style+"Style";
Object[]toppings=toppingList.getSelectedValues();
for(Objecttopping:toppings){
result+="
+"+topping.toString();
total+=MainFrame.this.toppings.get(topping.toString());
}
result+="
Total:"+total;
txtResult.setText(result);
}
});
bottomPanel.add(btnRingUp);
JButtonbtnQuit=newJButton("Quit");
btnQuit.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
MainFrame.this.dispose();
}
});
bottomPanel.add(btnQuit);
}
}
publicclassApp{
publicstaticvoidmain(String[]args){
MainFramemainFrame=newMainFrame();
mainFrame.setVisible(true);
}
}
⑦ JavaSwing图形界面开发与案例详解的内容简介
全书共20章,其中第1~2章主要介绍有关Swing的基础知识,包括Swing的基本概述、如何使用IDE开发Swing程序;第3~15章结合众多实例和问题介绍最常用、最有用的组件及其应用方法,包括标签和按钮组件、布局管理器组件、面板组件、列表框组件、下拉列表框组件、进度条组件、时间组件、滑块组件、分隔条组件、选取器组件、文本组件、窗口组件、对话框组件、JApplet组件、菜单组件、工具条组件、表格组件、树组件以及组件的事件处理机制等;第16~19章主要讲述有关Swing图形开发的其他知识,包括观感器、Swing线程与并发、模型与架构等。第20章通过一个综合实例使读者能够在实际开发中理解和巩固所学知识,从而提高综合应用能力。
《JavaSwing图形界面开发与案例详解》几乎涵盖了目前JavaSwing图形开发必备的所有常用知识,拥有丰富的实例,且这些实例均来自于工程实践,《JavaSwing图形界面开发与案例详解》适合Java程序语言的初学者阅读,也可供具有一定编程经验的初级编程人员参考。