软件著作权申请中源代码文档的编辑方法是什么?软件著作权是知识产权中的例外,因为著作权的取得无须经过个别确认,这就是人们常说的自动保护原则。软件经过登记后,软件著作权人享有发表权、开发者身份权、使用权、使用许可权和获得报酬权。那么软件著作权申请中源代码文档的编辑方法是什么?软件著作权申请中源代码文档的编辑方法软件著作权申请中源代码文档的编辑方法:一、清除整个文档的空行:方法:用ctrl+a(快捷方式),选中全部源程序代码文档;点击word的查找替换功能查找:^p^P;替换为:^P。选择全部替换。反复N次,直到全部替换完成。二、源代码每页不低于50行的实现方法:1、设置整个文档的字体和字号:方法:用ctrl+a,全选文档。在选中的文档上,点击鼠标右键(功能键),找到字体选项,选择+中文正文字体、五号字。2、通过文档的段落功能设置,实现文档每页不低于50行的要求。方法:ctrl+a,文档全选。在文档全选的情况下,点击鼠标右键(功能键)。找到段落选项。调出对话框对文档进行设置如下:选择行距:固定值;设置值:14磅。三、文档的页眉及页码的设置(字号用5号)此文档的页眉填加软件著作权的全称+版本号和页码。四、文档首页设置与编辑方法:文字竖排:先插入文本框,再录入文字软件源程序。选择竖排文字格式,调整字号,调整文本框到页面合适的位置。五、提示:文档的页眉上,尽量要用软件全称且含版本号。目的:如果你的软件简称出现问题时,源代码文档不受任何影响!为调整几个字重新打印61页(源程序要求60页,封面1页)纸会很不爽的!
这种东西很多了,随便搜索一大堆:这是个学生成绩的!
#include <iostreamh>
#include <iomaniph>
#include <fstream>
#include <vector>
#include <malloch>
#include <stdlibh>
#include <string>
#include <processh>
#include <stdioh>
//#define NULL 0
int const Q=20;
#define LEN sizeof(struct student)
using namespace std;
int n=0; //定义一个全局变量统计学生人数
//——--------->定义一个学生考试信息的结构体
struct student
{
char name[Q]; //用来存放姓名的
char sex[Q]; //用来存放性别的
long int id; //用来存放准考证号的
int score[4]; //用来存放分数的
int total; //用来存放总分数的
struct student next;
};
//student向量容器
vector <student> stu;
//-------------->学生类
class Information
{
public:
Information() ; //构造函数
~Information() ; //析构函数
student creat();//建立链表函数。
void output(student head);
int count(student head);//定义函数count()统计考生总数
student insert(studenthead);//指针函数insert()用来添加考生信息
student cancel(student head,long int num);//指针函数cancel()用来删除考生信息
student find(student head,long int num); //指针函数find()用来查找考生信息
void inorder(student head);//定义inorder()函数将考生的总分从大到小排列并输出
void average( student head);//求学生成绩的平均分的函数
void save(student head);//保存函数
student Read();//读取函数
private:
student p1,p2,p3,head,st;
};
Information::Information()
{
cout<<" \n";
cout<<" ------------------------<<欢迎您使用学生成绩管理系统>>------------------------\n";
cout<<" \n\n";
}
Information::~Information()
{
cout<<" \n";
cout<<" ------------------------<<谢谢您使用学生成绩管理系统>>------------------------\n";
cout<<" \n";
}
student Information::creat(void)
{//定义一个指向struct student的结构体指针函数creat()用来增加考生信息
char ch[Q];n=0; //用来存放姓名的
p1=p2=(student )malloc(LEN);//调用malloc()函数用来开辟一个新的存储单元
cout<<" -------------<<请建立学生考试信息表,在姓名处键以 ! 结束输入。>>--------------"<<endl;
cout<<" 姓名:";
cin>>ch;
head=NULL; //给指针head赋初值
while (strcmp(ch,"!")!=0)
{//调用字符比较函数strcmp()用来判断是否继续输入
char str[10];
int flag=0;
p1=(student )malloc(LEN);//调用malloc()函数用来开辟一个新的存储单元
strcpy(p1->name,ch); //将循环结构前面输入的姓名复制到结构体名为p1的数组name中
cout<<" 性别:";
cin>>p1->sex;
cout<<" 准考证号(8位):";
do{
cin>>str;
if(atol(str)>99999999 || atol(str)<1)
cout<<"对不起,请正确输入!!!\n";
else
{
p1->id=atol(str); flag=1;
}
}while(flag==0);
flag=0;
cout<<" 计算机组成原理成绩:";
do{
cin>>str;
if(atoi(str)>100 || atoi(str)<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
{
p1->score[0]=atoi(str); flag=1;
}
}while(flag==0);
flag=0;
cout<<" 概率统计成绩:";
do{
cin>>str;
if(atoi(str)>100 || atoi(str)<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
{ p1->score[1]=atoi(str); flag=1;}
}while(flag==0);
flag=0;
cout<<" 英语成绩:";
do{
cin>>str;
if(atoi(str)>100 || atoi(str)<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
{ p1->score[2]=atoi(str); flag=1;}
}while(flag==0);
flag=0;
cout<<" C++成绩:";
do{
cin>>str;
if(atoi(str)>100 || atoi(str)<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
{ p1->score[3]=atoi(str); flag=1;}
}while(flag==0);
flag=0;
p1->total=p1->score[0]+p1->score[1]+p1->score[2]+p1->score[3];//计算总分
if(n==0)head=p1;//如果是输入第一组学生考试信息就将指针p1赋给指针head
else p2->next=p1;//否则将p1赋给p2所指结构体的next指针
p2=p1;//将指针p1赋给指针p2
n++; //将n的值加1
cout<<" 姓名:";
cin>>ch;//将输入的姓名存放到字符数组ch中
}
p2->next=NULL;//将p2所指结构体的next指针重新赋空值
return (head);//将输入的第一组学生考试信息返回
}
//--------------->定义output()函数将考生的信息从头指针所指内容开始输出
void Information::output(student head)
{
if(head==NULL) cout<<" 这是一个空表,请先输入考生成绩\n";
else{
cout<<"-------------------------------------------------------------------------------\n";
cout<<" 学生考试成绩信息表\n";
cout<<"-------------------------------------------------------------------------------\n";
cout<<"准考证号 姓 名 性别 计算机组成原理 概率统计 英语 C++ 平均分 总分\n";
cout<<"-------------------------------------------------------------------------------\n";
p1=head;//将头指针赋给p
do
{
cout<<setw(8)<<p1->id
<<setw(9)<<p1->name
<<setw(8)<<p1->sex
<<setw(13)<<p1->score[0]
<<setw(16)<<p1->score[1]
<<setw(10)<<p1->score[2]
<<setw(9)<<p1->score[3]
<<setw(6)<<p1->total/40
<<setw(11)<<p1->total<<endl;
cout<<"-------------------------------------------------------------------------------\n";
p1=p1->next;//将下一组考生信息的next指针赋给p
}while(p1!=NULL);//若指针p非空则继续,目的是把所有的考生信息都传给指针p然后输出
}
}
//------------>统计学生人数的函数
int Information::count(struct student head)//定义函数count()统计考生总数
{
if(head==NULL)
return(0);//若指针head为空返回值为0
else return(1+count(head->next));//函数的递归调用
}
//----------->插入学生的成绩的函数
student Information::insert( student head)
//插入新结点定义一个指向struct student的结构体指针函数insert()用来添加考生信息
{
char str[10];
int flag=0;
cout<<"\t----------------<<请输入新增学生成绩信息>>----------------\n"<<endl;
p1=(student )malloc(LEN); //使p1指向插入的新结点
cout<<" 姓名:";
cin>>p1->name; //将输入的姓名存放到结构体名为p1的数组name中
cout<<" 性别:";
cin>>p1->sex;
cout<<" 准考证号(8位):";
do{
cin>>str;
if(atol(str)>99999999 || atol(str)<1)
cout<<"对不起,请请正确输入!!!\n";
else
{p1->id=atol(str); flag=1; }
}while(flag==0);
flag=0;
cout<<" 计算机组成原理成绩:";
do{
cin>>str;
if(atoi(str)>100 || atoi(str)<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
{ p1->score[0]=atoi(str); flag=1;}
}while(flag==0);
flag=0;
cout<<" 概率统计成绩:";
do{
cin>>str;
if(atoi(str)>100 || atoi(str)<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
{ p1->score[1]=atoi(str); flag=1;}
}while(flag==0);
flag=0;
cout<<" 英语成绩:";
do{
cin>>str;
if(atoi(str)>100 || atoi(str)<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
{ p1->score[2]=atoi(str); flag=1;}
}while(flag==0);
flag=0;
cout<<" C++成绩:";
do{
cin>>str;
if(atoi(str)>100 || atoi(str)<1)
cout<<"对不起,请输入1-100之间的数字!!\n";
else
{ p1->score[3]=atoi(str); flag=1;}
}while(flag==0);
flag=0;
p1->total=p1->score[0]+p1->score[1]+p1->score[2]+p1->score[3];//计算总分
p2=head;//将头指针赋给p2
if(head==NULL) //若没调用次函数以前的头指针head为空
{
head=p1;p1->next=NULL;
}//则将p1赋给头指针head并将p1所指结构体成员指针next赋空值
else
{
while((p1->id>p2->id)&&(p2->next!=NULL))
{
p3=p2;//p3指向原p2指向的结点
p2=p2->next;
}//p2后移一个结点
if(p1->id<=p2->id)
{
if(head==p2)
{
p1->next=head;
head=p1;
} //插入到第一个结点之前
else
{
p3->next=p1;
p1->next=p2;
} //插入到p3所指结点之后
}
else
{
p2->next=p1;
p1->next=NULL;
} //插入到尾结点之后
}
n++;//将学生人数加1
cout<<"\t你输入的学生信息已经成功插入"<<endl;
return (head);
}
//------------>删除函数
student Information::cancel(student head,long int num)//定义一个指向struct student的结构体指针函数delete()用来删除考生信息
{
if(head==NULL)//若调用次函数以前的头指针head为空
{
return(head);
}
else
{
p1=head;//否则将头指针赋给p1
while(num!=p1->id&&p1->next!=NULL)//寻找要删除的结点当p1所指的学生准考证号不是输入的学生准考证号并且p1所指的next指针不为空
{
p2=p1;
p1=p1->next;
}//p2指向原p1指向的结点p1后移一个结点
if(num==p1->id)//如果输入的学生准考证号是p1所指的学生准考证号//结点找到后删除
{
if(p1==head) head=p1->next;//如果head指针和p1指针相等则将下一个结点赋给指针head
else
p2->next=p1->next;//否则将p1所指结点赋给p2所指结点将要删除的学生信息跳过去
cout<<" 删除准考证号为"<<num<<"的学生\n";
n--;//将学生人数减1
}
return(head);//将头指针返回
}
}
//------------>查找函数
student Information::find(student head,long int num)
//定义一个指向struct student的结构体指针函数find()用来查找考生信息
{
if(head==NULL)//若调用次函数以前的头指针head为空
{
cout<<" 这是一个空表,请先输入考生成绩\n";
return(head);
}
else
{
p1=head;//否则将头指针赋给p1
while(num!=p1->id&&p1->next!=NULL)
//寻找结点当p1所指的学生准考证号不是输入的学生准考证号并且p1所指的next指针不为空
{
p1=p1->next;
}//p2指向原p1指向的结点p1后移一个结点
if(num==p1->id)//如果要查找的学生准考证号是p1所指的学生准考证号
{
cout<<"------------------------------------------------------------------------------\n";
cout<<"准考证号 姓名 性别 计算机组成原理 概率统计 英语 C++ 平均分 总分 \n";
cout<<"------------------------------------------------------------------------------\n";
cout<<setw(8)<<p1->id
<<setw(9)<<p1->name
<<setw(8)<<p1->sex
<<setw(13)<<p1->score[0]
<<setw(16)<<p1->score[1]
<<setw(10)<<p1->score[2]
<<setw(9)<<p1->score[3]
<<setw(6)<<p1->total/40
<<setw(11)<<p1->total<<endl;
cout<<"------------------------------------------------------------------------------\n";
}
else
cout<<" 没找到准考证号为"<<num<<"的学生\n"; //结点没找到
return(head);
}
}
//------------定义inorder()函数将考生的总分从大到小排列并输出
void Information::inorder(student head)
{
int i,k,m=0,j;
student p[Q];//定义一个指向struct student的结构体指针数组p
if(head!=NULL)//如果头指针是空则继续
{ m=count(head);
cout<<"------------------------------------------------------------------------------\n";
cout<<"学生考试成绩统计表\n";
cout<<"------------------------------------------------------------------------------\n";
cout<<"准考证号 姓 名 性别 计算机组成原理 概率统计 英语 C++ 平均分 总分 名次\n";
cout<<"------------------------------------------------------------------------------\n";
p1=head;
for(k=0;k<m;k++)
{
p[k]=p1;
p1=p1->next;
}
for(k=0;k<m-1;k++) //选择排序法
for(j=k+1;j<m;j++)
if(p[k]->total<p[j]->total)
{
p2=p[k];
p[k]=p[j];
p[j]=p2;
} //从大到小排列的指针
for(i=0;i<m;i++)
{
cout<<setw(8)<<p1->id
<<setw(9)<<p1->name
<<setw(8)<<p1->sex
<<setw(13)<<p1->score[0]
<<setw(16)<<p1->score[1]
<<setw(10)<<p1->score[2]
<<setw(9)<<p1->score[3]
<<setw(6)<<p1->total/40
<<setw(11)<<p1->total<<endl;
cout<<"------------------------------------------------------------------------------\n";
}
}
}
//------------>求各科平均分成绩的函数
void Information::average(student head)
{
int k,m;
float arg1=0,arg2=0,arg3=0,arg4=0;
if(head==NULL)//如果头指针是空则继续
{
cout<<" 这是一个空表,请先输入考生成绩\n";
}
else
{
m=count(head);
p1=head;
for(k=0;k<m;k++)
{
arg1+=p1->score[0];
arg2+=p1->score[1];
arg3+=p1->score[2];
arg4+=p1->score[3];
p1=p1->next;
}
arg1/=m;arg2/=m;arg3/=m;arg4/=m;
cout<<"全班单科成绩平均分\n";
cout<<"------------------------------------------------------------------------------\n";
cout<<" 计算机组成原理平均分:"<<setw(7)<<arg1
<<" 概率统计平均分:"<<setw(7)<<arg2
<<" 英语平均分:"<<setw(7)<<arg3
<<" C++平均分:"<<setw(7)<<arg4<<endl;
cout<<"------------------------------------------------------------------------------\n";
}
}
//------------------->保存函数
void Information::save(student head)
{
ofstream out("datatxt",ios::out);
out<<count(head)<<endl;
while(head!=NULL)
{ out<<head->name<<"\t"
<<head->id<<"\t"<<"\t"
<<head->sex<<"\t"
<<head->score[0]<<"\t"
<<head->score[1]<<"\t"
<<head->score[2]<<"\t"
<<head->score[3]<<"\t"
<<head->total<<endl;
head=head->next;
}
}
//———————————>读取函数的实现
student Information::Read()
{ int i=0;
p1=p2=( student )malloc(LEN);
head=NULL;
ifstream in("datatxt",ios::out);
in>>i;
if(i==0){cout<<" datatxt 文件中的数据为空,请先输入数据。"<<endl; return 0;}
else {
cout<<" …………………………………………………………………………………………"<<endl;
for(;i>0;i--)
{ p1=(student )malloc(LEN);
cin>>stname>>stid>>stsex
>>stscore[0]>>stscore[1]>>stscore[2]>>stscore[3]
>>sttotal;
strcpy(p1->name,stname);
p1->id=stid;
strcpy(p1->sex,stsex);
p1->score[0]=stscore[0];
p1->score[1]=stscore[1];
p1->score[2]=stscore[2];
p1->score[3]=stscore[3];
p1->total=sttotal;
if(n==0)head=p1;//如果是输入第一组学生考试信息就将指针p1赋给指针head
else p2->next=p1;//否则将p1赋给p2所指结构体的next指针
p2=p1;//将指针p1赋给指针p2
n++; //将n的值加1
//显示读入数据
cout<<" "<<p1->name<<"\t"
<<p1->id<<"\t"<<"\t"
<<p1->sex<<"\t"
<<p1->score[0]<<"\t"
<<p1->score[1]<<"\t"
<<p1->score[2]<<"\t"
<<p1->score[3]<<"\t"
<<p1->total<<endl;
cout<<" …………………………………………………………………………………………"<<endl;
//
}
cout<<" 数据已经成功读取完毕。"<<endl;
p2->next=NULL;
return (head);
}
}
//------------------------------>主函数
int main(void)
{
Information person;
student head=NULL;
char str[10];
int flag=0;
int choice;
long int i;
head=personRead();
do{
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓";
cout<<"┃ 学生成绩管理系统主菜单界面 ┃";
cout<<"┃ 读取数据请输入数字零 ┃";
cout<<"┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫";
cout<<"┃ ①输入学生成绩 ┃";
cout<<"┃ ②显示学生成绩 ┃";
cout<<"┃ ③排序统计成绩 ┃";
cout<<"┃ ④查找学生成绩 ┃";
cout<<"┃ ⑤增加学生成绩 ┃";
cout<<"┃ ⑥删除学生成绩 ┃";
cout<<"┃ ⑦保存退出系统 ┃";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛";
cout<<"请输入您的选择(1--7):( )\b\b";
cin>>str;
if(atoi(str)>7 || atoi(str)<1)
cout<<"对不起,请输入1-7这几个数字!!\n";
else
{
choice=atoi(str);
switch(choice)
{
case 1:
head=personcreat();
break;
case 2:
personoutput(head);
break;
case 3:
personinorder(head);
personaverage(head);
cout<<" 参加考试的学生人数为:"<<personcount(head)<<"人\n";
break;
case 4:
cout<<" 请输入要查找的准考证号(8位):";
do{
cin>>str;
if(atol(str)>99999999 || atol(str)<1)
cout<<"对不起,请输入正确输入!!!\n";
else
{i=atol(str); flag=1; }
}while(flag==0);
flag=0;
personfind(head,i);
break;
case 5:
head=personinsert(head);
personoutput(head);
break;
case 6:
cout<<" 请输入要删除的准考证号(8位):";
do{
cin>>str;
if(atol(str)>99999999 || atol(str)<1)
cout<<"对不起,请输入正确输入!!!h\n";
else
{i=atol(str); flag=1; }
}while(flag==0);
flag=0;
head=personcancel(head,i);
personoutput(head);
break;
case 7:
personsave(head);
cout<<"文件已保存!可以安全退出!!!"<<endl;
break;
default :cout<<" 对不起,您的输入有误,请重新输入。\n";
break;
}
}
}while(choice!=7);
return 0;
}
一 高亮的内容:
需要高亮的内容有:
1 关键字, 如 public, int, true 等
2 运算符, 如 +, -, , /等
3 数字
4 高亮字符串, 如 "example of string"
5 高亮单行注释
6 高亮多行注释
二 实现高亮的核心方法:
StyledDocumentsetCharacterAttributes(int offset, int length, AttributeSet s, boolean replace)
三 文本编辑器选择
Java中提供的多行文本编辑器有: JTextComponent, JTextArea, JTextPane, JEditorPane等, 都可以使用 但是因为语法着色中文本要使用多种风格的样式, 所以这些文本编辑器的document要使用StyledDocument
JTextArea使用的是PlainDocument, 此document不能进行多种格式的着色
JTextPane, JEditorPane使用的是StyledDocument, 默认就可以使用
为了实现语法着色, 可以继承自DefaultStyledDocument, 设置其为这些文本编辑器的documet, 或者也可以直接使用JTextPane, JEditorPane来做 为了方便, 这里就直接使用JTextPane了
四 何时进行着色
当文本编辑器中有字符被插入或者删除时, 文本的内容就发生了变化, 这时检查, 进行着色
为了监视到文本的内容发生了变化, 要给document添加一个DocumentListener监听器, 在他的removeUpdate和insertUpdate中进行着色处理
而changedUpdate方法在文本的属性例如前景色, 背景色, 字体等风格改变时才会被调用
@Override
public void changedUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
try {
colouring((StyledDocument) egetDocument(), egetOffset(), egetLength());
} catch (BadLocationException e1) {
e1printStackTrace();
}
}
@Override
public void removeUpdate(DocumentEvent e) {
try {
// 因为删除后光标紧接着影响的单词两边, 所以长度就不需要了
colouring((StyledDocument) egetDocument(), egetOffset(), 0);
} catch (BadLocationException e1) {
e1printStackTrace();
}
}
五 着色范围:
pos: 指变化前光标的位置
len: 指变化的字符数
例如有关键字public, int
单词"publicint", 在"public"和"int"中插入一个空格后变成"public int", 一个单词变成了两个, 这时对"public" 和 "int"进行着色
着色范围是public中p的位置和int中t的位置加1, 即是pos前面单词开始的下标和pos+len开始单词结束的下标 所以上例中要着色的范围是"public int"
提供了方法indexOfWordStart来取得pos前单词开始的下标, 方法indexOfWordEnd来取得pos后单词结束的下标
public int indexOfWordStart(Document doc, int pos) throws BadLocationException {
// 从pos开始向前找到第一个非单词字符
for (; pos > 0 && isWordCharacter(doc, pos - 1); --pos);
return pos;
}
public int indexOfWordEnd(Document doc, int pos) throws BadLocationException {
// 从pos开始向前找到第一个非单词字符
for (; isWordCharacter(doc, pos); ++pos);
return pos;
}
一个字符是单词的有效字符: 是字母, 数字, 下划线
public boolean isWordCharacter(Document doc, int pos) throws BadLocationException {
char ch = getCharAt(doc, pos); // 取得在文档中pos位置处的字符
if (CharacterisLetter(ch) || CharacterisDigit(ch) || ch == '_') { return true; }
return false;
}
所以着色的范围是[start, end] :
int start = indexOfWordStart(doc, pos);
int end = indexOfWordEnd(doc, pos + len);
六 关键字着色
从着色范围的开始下标起进行判断, 如果是以字母开或者下划线开头, 则说明是单词, 那么先取得这个单词, 如果这个单词是关键字, 就进行关键字着色, 如果不是, 就进行普通的着色 着色完这个单词后, 继续后面的着色处理 已经着色过的字符, 就不再进行着色了
public void colouring(StyledDocument doc, int pos, int len) throws BadLocationException {
// 取得插入或者删除后影响到的单词
// 例如"public"在b后插入一个空格, 就变成了:"pub lic", 这时就有两个单词要处理:"pub"和"lic"
// 这时要取得的范围是pub中p前面的位置和lic中c后面的位置
int start = indexOfWordStart(doc, pos);
int end = indexOfWordEnd(doc, pos + len);
char ch;
while (start < end) {
ch = getCharAt(doc, start);
if (CharacterisLetter(ch) || ch == '_') {
// 如果是以字母或者下划线开头, 说明是单词
// pos为处理后的最后一个下标
start = colouringWord(doc, start);
} else {
//SwingUtilitiesinvokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle));
++start;
}
}
}
public int colouringWord(StyledDocument doc, int pos) throws BadLocationException {
int wordEnd = indexOfWordEnd(doc, pos);
String word = docgetText(pos, wordEnd - pos); // 要进行着色的单词
if (keywordscontains(word)) {
// 如果是关键字, 就进行关键字的着色, 否则使用普通的着色
// 这里有一点要注意, 在insertUpdate和removeUpdate的方法调用的过程中, 不能修改doc的属性
// 但我们又要达到能够修改doc的属性, 所以把此任务放到这个方法的外面去执行
// 实现这一目的, 可以使用新线程, 但放到swing的事件队列里去处理更轻便一点
SwingUtilitiesinvokeLater(new ColouringTask(doc, pos, wordEnd - pos, keywordStyle));
} else {
SwingUtilitiesinvokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle));
}
return wordEnd;
}
因为在insertUpdate和removeUpdate方法中不能修改document的属性, 所以着色的任务放到这两个方法外面, 所以使用了SwingUtilitiesinvokeLater来实现
private class ColouringTask implements Runnable {
private StyledDocument doc;
private Style style;
private int pos;
private int len;
public ColouringTask(StyledDocument doc, int pos, int len, Style style) {
thisdoc = doc;
thispos = pos;
thislen = len;
thisstyle = style;
}
public void run() {
try {
// 这里就是对字符进行着色
docsetCharacterAttributes(pos, len, style, true);
} catch (Exception e) {}
}
}
七: 源码
关键字着色的完成代码如下, 可以直接编译运行 对于数字, 运算符, 字符串等的着色处理在以后的教程中会继续进行详解
import javaawtColor;
import javautilHashSet;
import javautilSet;
import javaxswingJFrame;
import javaxswingJTextPane;
import javaxswingSwingUtilities;
import javaxswingeventDocumentEvent;
import javaxswingeventDocumentListener;
import javaxswingtextBadLocationException;
import javaxswingtextDocument;
import javaxswingtextStyle;
import javaxswingtextStyleConstants;
import javaxswingtextStyledDocument;
public class HighlightKeywordsDemo {
public static void main(String[] args) {
JFrame frame = new JFrame();
JTextPane editor = new JTextPane();
editorgetDocument()addDocumentListener(new SyntaxHighlighter(editor));
framegetContentPane()add(editor);
framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
framesetSize(500, 500);
framesetVisible(true);
}
}
/
当文本输入区的有字符插入或者删除时, 进行高亮
要进行语法高亮, 文本输入组件的document要是styled document才行 所以不要用JTextArea 可以使用JTextPane
@author Biao
/
class SyntaxHighlighter implements DocumentListener {
private Set<String> keywords;
private Style keywordStyle;
private Style normalStyle;
public SyntaxHighlighter(JTextPane editor) {
// 准备着色使用的样式
keywordStyle = ((StyledDocument) editorgetDocument())addStyle("Keyword_Style", null);
normalStyle = ((StyledDocument) editorgetDocument())addStyle("Keyword_Style", null);
StyleConstantssetForeground(keywordStyle, ColorRED);
StyleConstantssetForeground(normalStyle, ColorBLACK);
// 准备关键字
keywords = new HashSet<String>();
keywordsadd("public");
keywordsadd("protected");
keywordsadd("private");
keywordsadd("_int9");
keywordsadd("float");
keywordsadd("double");
}
public void colouring(StyledDocument doc, int pos, int len) throws BadLocationException {
// 取得插入或者删除后影响到的单词
// 例如"public"在b后插入一个空格, 就变成了:"pub lic", 这时就有两个单词要处理:"pub"和"lic"
// 这时要取得的范围是pub中p前面的位置和lic中c后面的位置
int start = indexOfWordStart(doc, pos);
int end = indexOfWordEnd(doc, pos + len);
char ch;
while (start < end) {
ch = getCharAt(doc, start);
if (CharacterisLetter(ch) || ch == '_') {
// 如果是以字母或者下划线开头, 说明是单词
// pos为处理后的最后一个下标
start = colouringWord(doc, start);
} else {
SwingUtilitiesinvokeLater(new ColouringTask(doc, start, 1, normalStyle));
++start;
}
}
}
/
对单词进行着色, 并返回单词结束的下标
@param doc
@param pos
@return
@throws BadLocationException
/
public int colouringWord(StyledDocument doc, int pos) throws BadLocationException {
int wordEnd = indexOfWordEnd(doc, pos);
String word = docgetText(pos, wordEnd - pos);
if (keywordscontains(word)) {
// 如果是关键字, 就进行关键字的着色, 否则使用普通的着色
// 这里有一点要注意, 在insertUpdate和removeUpdate的方法调用的过程中, 不能修改doc的属性
// 但我们又要达到能够修改doc的属性, 所以把此任务放到这个方法的外面去执行
// 实现这一目的, 可以使用新线程, 但放到swing的事件队列里去处理更轻便一点
SwingUtilitiesinvokeLater(new ColouringTask(doc, pos, wordEnd - pos, keywordStyle));
} else {
SwingUtilitiesinvokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle));
}
return wordEnd;
}
/
取得在文档中下标在pos处的字符
如果pos为docgetLength(), 返回的是一个文档的结束符, 不会抛出异常 如果pos<0, 则会抛出异常
所以pos的有效值是[0, docgetLength()]
@param doc
@param pos
@return
@throws BadLocationException
/
public char getCharAt(Document doc, int pos) throws BadLocationException {
return docgetText(pos, 1)charAt(0);
}
/
取得下标为pos时, 它所在的单词开始的下标 ±wor^d± (^表示pos, ±表示开始或结束的下标)
@param doc
@param pos
@return
@throws BadLocationException
/
public int indexOfWordStart(Document doc, int pos) throws BadLocationException {
// 从pos开始向前找到第一个非单词字符
for (; pos > 0 && isWordCharacter(doc, pos - 1); --pos);
return pos;
}
/
取得下标为pos时, 它所在的单词结束的下标 ±wor^d± (^表示pos, ±表示开始或结束的下标)
@param doc
@param pos
@return
@throws BadLocationException
/
public int indexOfWordEnd(Document doc, int pos) throws BadLocationException {
// 从pos开始向前找到第一个非单词字符
for (; isWordCharacter(doc, pos); ++pos);
return pos;
}
/
如果一个字符是字母, 数字, 下划线, 则返回true
@param doc
@param pos
@return
@throws BadLocationException
/
public boolean isWordCharacter(Document doc, int pos) throws BadLocationException {
char ch = getCharAt(doc, pos);
if (CharacterisLetter(ch) || CharacterisDigit(ch) || ch == '_') { return true; }
return false;
}
@Override
public void changedUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
try {
colouring((StyledDocument) egetDocument(), egetOffset(), egetLength());
} catch (BadLocationException e1) {
e1printStackTrace();
}
}
@Override
public void removeUpdate(DocumentEvent e) {
try {
// 因为删除后光标紧接着影响的单词两边, 所以长度就不需要了
colouring((StyledDocument) egetDocument(), egetOffset(), 0);
} catch (BadLocationException e1) {
e1printStackTrace();
}
}
/
完成着色任务
@author Biao
/
private class ColouringTask implements Runnable {
private StyledDocument doc;
private Style style;
private int pos;
private int len;
public ColouringTask(StyledDocument doc, int pos, int len, Style style) {
thisdoc = doc;
thispos = pos;
thislen = len;
thisstyle = style;
}
public void run() {
try {
// 这里就是对字符进行着色
docsetCharacterAttributes(pos, len, style, true);
} catch (Exception e) {}
}
}
}
以上就是关于软件著作权申请中源代码文档的编辑方法是什么全部的内容,包括:软件著作权申请中源代码文档的编辑方法是什么、《C语言程序设计》项目设计、java源代码编辑器 设计用于编写Java源代码的编辑器,基本要求:可以完成源程序的文件打开,编辑和文件保存等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)