自上半年JAVA课程结束后,再也没有看过JAVA了,最近不是很忙,又简单的看了看,本博客纯属记录学习过程,请大神们别笑,其中错误是难免的,毕竟是新手写的博客。下面就进入我们的正题吧,复习GUI时,就想到WINDOWS的记事本,如果用GUI来仿写应该不难。实现向记事本这样的文本编辑器,第一步,当然是界面的问题,这对于GUI来说再简单不过了,所以我也不多说了,直接贴上代码即可,相信都能看懂。

创建菜单代码:

 //创建主菜单
public void createMenu()
{
//创建JMenuBar菜单条
mainMenuBar=new JMenuBar();
//创建四个JMenu下拉菜单
fileMenu=new JMenu("文件(F)");
editMenu=new JMenu("编辑(E)");
formatMenu=new JMenu("格式(O)");
viewMenu=new JMenu("查看(V)");
helpMenu=new JMenu("帮助(H)");
//创建JMenuItem并添加到对应的JMenu中
mainMenuBar.add(fileMenu);
newItem=new JMenuItem("新建");
openItem=new JMenuItem("打开..");
saveItem=new JMenuItem("保存..");
saveasItem=new JMenuItem("另存为..");
pageItem=new JMenuItem("页面设置..");
printItem=new JMenuItem("打印..");
exitItem=new JMenuItem("退出");
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(saveasItem);
fileMenu.addSeparator();
fileMenu.add(pageItem);
fileMenu.add(printItem);
fileMenu.addSeparator();
fileMenu.add(exitItem); mainMenuBar.add(editMenu);
undoItem=new JMenuItem("撤消");
cutItem=new JMenuItem("剪切");
copyItem=new JMenuItem("复制");
pasteItem=new JMenuItem("粘贴");
findItem=new JMenuItem("查找..");
replaceItem=new JMenuItem("替换..");
selectallItem=new JMenuItem("全选");
dateItem=new JMenuItem("时间/日期");
editMenu.add(undoItem);
editMenu.addSeparator();
editMenu.add(cutItem);
editMenu.add(copyItem);
editMenu.add(pasteItem);
editMenu.addSeparator();
editMenu.add(findItem);
editMenu.add(replaceItem);
editMenu.addSeparator();
editMenu.add(selectallItem);
editMenu.add(dateItem);
mainMenuBar.add(formatMenu);
wrapItem=new JCheckBoxMenuItem("自动换行");
fontItem=new JMenuItem("设置字体..");
formatMenu.add(wrapItem);
formatMenu.add(fontItem);
mainMenuBar.add(viewMenu);
mainMenuBar.add(helpMenu);
helpItem=new JMenuItem("查看帮助(H)");
aboutItem=new JMenuItem("关于记事本..(A)");
helpMenu.add(helpItem);
helpMenu.add(aboutItem);
//为每个菜单项添加监听器
exitItem.addActionListener(this);
saveItem.addActionListener(this);
saveasItem.addActionListener(this);
newItem.addActionListener(this);
printItem.addActionListener(this);
openItem.addActionListener(this);
cutItem.addActionListener(this);
copyItem.addActionListener(this);
pasteItem.addActionListener(this);
selectallItem.addActionListener(this);
dateItem.addActionListener(this);
wrapItem.addActionListener(this);
findItem.addActionListener(this);
fontItem.addActionListener(this);
helpItem.addActionListener(this);
aboutItem.addActionListener(this);
}

  下面继续看看每个菜单的具体响应和实现。

  1."新建"功能的实现:

    当使用者点击“新建”菜单时,首先要判断文件中的内容是否改变过,如果修改过,则询问使用者是否要保存修改,并且根据选择做出相应的动作,如果用户选择“是“,则保存修改后的文件,否则保存原来的文档。具体代码如下:

 void doNewFile()
{
int select,flag;
if (changed)//判断文件内容是否修改过
{
select=JOptionPane.showConfirmDialog(this,"文件修改后尚未存盘,要保存吗?");
switch (select)
{
case JOptionPane.YES_OPTION:
flag=doSave();
break;
case JOptionPane.NO_OPTION:
flag=1;
break;
default:
flag=0;
break;
}
}
else
{
flag = 1;
}
if(flag==1)//新建文件,并设置内容为空
{
changed=false;
haveName=false;
setTitle("无名称——记事本");
text.setText(null);
}
}

2

  2.“打开”功能的实现:

    当用户选择“打开”菜单时,首先判断文件内容是否修改过,若修改过,则询问是否保存,若用户选择“是”,则弹出保存窗口,否则弹出一个文件选择对话框由使用者选择要打开的文件,并且读入选择的文件的内容并复制给text。具体代码如下:

 void doOpenFile()
{
int select,flag;
File tmpfile=null;
ExampleFileFilter filter;
JFileChooser chooser;
FileInputStream fin;
byte buf[];
//判断文件内容是否修改过并询问是否存盘
if (changed)
{
select=JOptionPane.showConfirmDialog(this,"文件已修改,是否要保存?");
switch (select)
{
case JOptionPane.YES_OPTION:
flag=doSave();
break;
case JOptionPane.NO_OPTION:
flag=1;
break;
default:
flag=0;
break;
}
}
else
{
flag = 1;
}
//当前文件处理完毕,准备打开一个文件
if(flag==1)
{
changed = false;
//设置文件类型过滤器
filter = new ExampleFileFilter();
filter.addExtension("txt");
filter.setDescription("文本文件");
//模拟记事本设置默认打开路径
if (file!=null)
chooser = new JFileChooser(file.getPath());
else
chooser = new JFileChooser();
chooser.setFileFilter(filter);
select = chooser.showOpenDialog(this);
if(select == JFileChooser.APPROVE_OPTION)
{
tmpfile=chooser.getSelectedFile();//使用文件流读入文件类容
try
{
fin=new FileInputStream(tmpfile);
buf=new byte[(int)tmpfile.length()];
fin.read(buf);
fin.close();
text.setText(new String(buf));//实现内容的现实
changed=false;
haveName=true;
file=tmpfile;
setTitle("记事本 -- "+file.getName());
}catch(FileNotFoundException e)
{
JOptionPane.showMessageDialog(this,"指定的文件名称或属性有问题!");
}catch(IOException e)
{
JOptionPane.showMessageDialog(this,"无法读文件,请检查文件是否被锁定");
}
}
}
}

3

运行截图:

  3.保存功能的实现:

    当使用者点击“保存”菜单时,需要完成如下事情:第一、判断文件是否为新建的文件,如果是,则调用doSaveAs()来保存;否则,判断原文件内容是否发生修改,若修改过,再询问用户是否另存,否则不做任何动作。具体代码如下:

 //保存使用者编辑的文件,保存成功返回1,否则返回0
int doSave()
{
FileOutputStream fout;
byte content[];
int flag;
if (!haveName)//判断是否新建的文件
{
flag = doSaveAs();
}
else if(changed)//判断内容是否发生修改
{
try
{
fout=new FileOutputStream(file);
content=text.getText().getBytes();
fout.write(content);
fout.close();
changed=false;
flag = 1;
}catch(FileNotFoundException e)//进行相应异常处理
{
JOptionPane.showMessageDialog(this,"指定的文件名称或属性有问题!");
flag = 0;
}catch(IOException e)
{
JOptionPane.showMessageDialog(this,"无法写文件,请检查文件是否被锁定");
flag = 0;
}
}
else
{
flag =1;
}
return flag;
}

  4.实现“另保存”功能:

    当使用者选择“另存为”菜单时,打开一个保存对话框,让使用者选择保存路径和文件名,如果文件名已存在,则弹出一个警告框,让使用者选择是否覆盖文件。否则以用户填写的文件名来保存文件并更改相关变量。

    为了实现这些功能,需要用到JFileChooser类和ExampleFileFilter类。而ExampleFileFilter类并不是JAVA标准库的类,所以必须将它引入的项目中,有关于相关的配置就不介绍了,网上有很多资料。同时,由于要处理用户的输入,因此需要大量的代码来提高容错率即程序的健壮性。具体代码如下:

 //用"另存为"对话框保存文件。保存成功返回1,否则返回0
int doSaveAs()
{
FileOutputStream fout;
byte content[];
int flag=0;
File tmpfile=null;
ExampleFileFilter filter = new ExampleFileFilter();
JFileChooser chooser;
filter.addExtension("txt");//设置保存文件对话框中的文件属性过滤器
filter.setDescription("文本文件");
if (file!=null)
chooser = new JFileChooser(file.getPath());
else
chooser = new JFileChooser();
chooser.setFileFilter(filter);//设置文件类型
flag = chooser.showSaveDialog(this);
if(flag == JFileChooser.APPROVE_OPTION)
{
tmpfile=chooser.getSelectedFile();
if (tmpfile.exists())//判断同名同类文件是否已存在
{
if (JOptionPane.showConfirmDialog(this,"文件已经存在,是否覆盖?",
"警告",JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION)
{
flag=1;
}
else
{
flag=0;
}
}
else
{
flag=1;
}
}
else
{
flag=0;
} if (flag==1)
{//用户已经确定要以指定名称保存文件
try
{
fout=new FileOutputStream(tmpfile);
content=text.getText().getBytes();
fout.write(content);
fout.close();
flag = 1;
}catch(FileNotFoundException e)
{
JOptionPane.showMessageDialog(this,"指定的文件名称或属性有问题!");
flag = 0;
}catch(IOException e)
{
JOptionPane.showMessageDialog(this,"无法写文件,请检查文件是否被锁定");
flag = 0;
}
} if (flag==1)
{//文件保存成功,修改相关变量
changed=false;
haveName=true;
file=tmpfile;
this.setTitle(file.getName()+"——记事本");
}
return flag;
}

  5.“打印”菜单功能的相应:
    JAVA中关于打印API主要存在于java.awt.print包中,但是,在此我们使用JDK1.4新增的javax.print包和其相应子包javax.print.event和javax.print.attribute中的类来实现打印功能。其中,javax.print包中的主要包括打印服务的相关类,而javax.print.evevt则包含打印事件的相关定义,javax.print.attribute则包括打印服务的可用属性列表等。

   要实现打印功能,步骤如下:

  • 定位到一台打印机
  • 指定要打印的格式
  • 设置打印属性
  • 设置打印内容
  • 开始打印  

  具体代码如下:

 //调用打印对话框,给用户打印文档
void doPrint()
{
try{
//构建打印属性集
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
//设置打印格式
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
//查找所有的可用打印服务
PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
//显示打印对话框
PrintService service = null;
service = ServiceUI.printDialog(null, 100, 100, printService, defaultService, flavor, pras);
if (service!=null)//
{
//创建打印作业
DocPrintJob job = service.createPrintJob();
DocAttributeSet das = new HashDocAttributeSet();
//建立打印文件格式
Doc doc = new SimpleDoc(text.getText().getBytes(), flavor, das);
//进行文件的打印
job.print(doc, pras);
}
}catch(Exception e)
{
JOptionPane.showMessageDialog(this,"打印任务无法完成");
}
}

  6."退出功能的实现"

    关于这个功能比较简单,但是需要注意一个问题,当点击窗体右上不得关闭按钮时,也需要作出相应的响应,而不是直接退出,因此,在程序中需要覆盖JFrame的窗口关闭方法processWindowEvent(注意:这里不是监听windowsClosing事件)。具体代码如下:

protected void processWindowEvent(WindowEvent e)
{
if (e.getID() == WindowEvent.WINDOW_CLOSING)
doExit();
}
//程序退出时的代码
void doExit()
{
int select;
if (!changed) //判断文件是否发生改变
System.exit(0);
else
{
select=JOptionPane.showConfirmDialog(this,"文件修改后尚未存盘,要保存吗?");
switch (select)
{
case JOptionPane.YES_OPTION:
select=doSave();
if (select==1)System.exit(0);
break;
case JOptionPane.NO_OPTION:
System.exit(0);
break;
case JOptionPane.CANCEL_OPTION:
break;
}
}
}

  7.“剪切”功能的实现:

    为了完成这一功能,应该为文本框添加两个监听器:键盘事件监听器KeyListener和鼠标事件监听器MouseListener。并且实现其中的keyPressed和mouseRealseed方法就可以了。这里我们采用继承相应的适配器类KeyAdapter和MouseAdapter即可。这部分相当简单,就不多说了。下面是具体代码:

//监听鼠标事件
class handleMouse extends MouseAdapter
{
public void mouseReleased(MouseEvent e)
{
chkText();
}
} //监听键盘事件
class handleKey extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
chkText();
}
} //根据用户选择文本的情况,修改菜单的状态
void chkText()
{
if(text.getSelectedText()==null)
{
cutItem.setEnabled(false);
copyItem.setEnabled(false);
}
else
{
cutItem.setEnabled(true);
copyItem.setEnabled(true);
}
}
//将用户选择的文本剪切到剪贴板
void doCut(){
text.cut();
}

  8.实现查找功能:

    由于该部分功能JDK并没有提供查找对话框,我就模仿Windows的记事本啦。代码如下:

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*; public class findDialog extends JDialog implements ActionListener
{
Container con;
JPanel panel1,panel2;
JTextArea text;
JLabel label1;
JTextField findEdit;
JCheckBox checkBox;
JRadioButton upBtn,downBtn;
ButtonGroup dirBtnGroup;
JButton OKBtn,CancleBtn; int start;
public findDialog(JFrame owner, JTextArea Jtext)
{
super(owner,false);
start=0;
text=Jtext;
panel1=new JPanel();
panel1.setLayout(new FlowLayout());
panel2=new JPanel();
panel2.setLayout(new FlowLayout()); label1=new JLabel("查找内容");
findEdit=new JTextField(12);
OKBtn=new JButton("查找下一个");
OKBtn.addActionListener(this);
panel1.add(label1);
panel1.add(findEdit);
panel1.add(OKBtn); checkBox=new JCheckBox("区分大小写");
checkBox.setSelected(true);
upBtn=new JRadioButton("向上");
downBtn=new JRadioButton("向下",true);
dirBtnGroup=new ButtonGroup();
dirBtnGroup.add(upBtn);
dirBtnGroup.add(downBtn);
CancleBtn=new JButton("取消");
CancleBtn.addActionListener(this);
panel2.add(checkBox);
panel2.add(upBtn);
panel2.add(downBtn);
panel2.add(CancleBtn); con=getContentPane();
con.setLayout(new FlowLayout());
con.add(panel1);
con.add(panel2);
setTitle("查找");
setSize(300,120);
setVisible(true);
} public void actionPerformed(ActionEvent e)
{
if (e.getSource()==OKBtn)
{
find(e);
}
else
{
dispose();
}
}
public void find(ActionEvent e)
{
int index;
if (start>text.getCaretPosition())
start=text.getCaretPosition();
//区分大小写查找
if((e.getSource()==checkBox)&&(checkBox.isSelected()==true))
{
index=text.getText().indexOf(findEdit.getText(),start);
IndexNum(index);
}//不区分大小写查找
else if((e.getSource()==checkBox)&&(checkBox.isSelected()==false))
{
index=text.getText().toUpperCase().indexOf(findEdit.getText().toUpperCase(),0);
IndexNum(index);
}
}
public void IndexNum(int index)
{
if (index<0)
{
JOptionPane.showMessageDialog(this,"查找完毕");
start=0;
}
else
{
text.setSelectionStart(index);
text.setSelectionEnd(index+findEdit.getText().length()-1);
start=index+findEdit.getText().length();
}
} }

运行截图如下:

  9.实现社字体功能

    对于这一部分功能,JDK并没有提供相应的设置对话框,因此,依旧仿照Windows提供的标准字体选择对话框来制作。对于此问题涉及到如何获取系统中的字体名称并显示在一个列表框中,再者如何将用户设置的字体字形和大小组合成一个Font对象返回给用户。对于界面,就模仿Windows的记事本界面,但是,在此处涉及到布局的问题,我就采用了表格布局和流式布局。

代码如下:

//设置字体
void doChangeFont()
{
if(myFontDialog==null)
myFontDialog=new fontDialog(this);
if(myFontDialog.showFontDialog()==fontDialog.OK)
text.setFont(myFontDialog.getFont());
}
 import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*; public class fontDialog extends JDialog implements ActionListener,ListSelectionListener
{
public static final int Cancle=0;
public static final int OK=1;
public static final String [] style={"正常","斜体","粗体","粗斜体"};
public static final String [] size={"8","9","10","11","12","14","16",
"18","20","22","24","26","28","36","48","72"};
//用于记录用户设置的字体信息
private Font userFont=null;
//标记用户按下的按钮
private int userSelect=Cancle;
//窗体的父窗体
private JFrame parent=null;
private Container con;
private JScrollPane nameSPane,styleSPane,sizeSPane;
private JPanel panel[];
private JLabel nameLbl,styleLbl,sizeLbl;
private JTextField nameText,styleText,sizeText;
private JList nameList,styleList,sizeList;
private JButton OKBtn,cancleBtn; public fontDialog()
{
this(null);
} public fontDialog(JFrame owner)
{
super(owner,true);
parent=owner;
setTitle("字体");
con=getContentPane();
BoxLayout box=new BoxLayout(con,BoxLayout.Y_AXIS);
con.setLayout(box);
panel=new JPanel[4];
for(int i=0;i<3;i++)
{
panel[i]=new JPanel();
panel[i].setLayout(new GridLayout(1,3));
}
panel[3]=new JPanel();
panel[3].setLayout(new FlowLayout()); nameLbl=new JLabel("字体");
styleLbl=new JLabel("字形");
sizeLbl=new JLabel("大小");
panel[0].add(nameLbl);
panel[0].add(styleLbl);
panel[0].add(sizeLbl); nameText=new JTextField("宋体");
nameText.setColumns(5);
nameText.setEditable(false);
styleText=new JTextField("正常");
styleText.setColumns(5);
styleText.setEditable(false);
sizeText=new JTextField("12");
sizeText.setColumns(5);
sizeText.setEditable(false);
panel[1].add(nameText);
panel[1].add(styleText);
panel[1].add(sizeText);
//获取系统所安装的字体的名称
GraphicsEnvironment eq = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] availableFonts= eq.getAvailableFontFamilyNames();
nameList=new JList(availableFonts);
nameList.addListSelectionListener(this);
nameSPane=new JScrollPane(nameList);
styleList=new JList(style);
styleList.addListSelectionListener(this);
styleSPane=new JScrollPane(styleList);
sizeList=new JList(size);
sizeList.addListSelectionListener(this);
sizeSPane=new JScrollPane(sizeList);
panel[2].add(nameSPane);
panel[2].add(styleSPane);
panel[2].add(sizeSPane); OKBtn=new JButton("确定");
OKBtn.addActionListener(this);
cancleBtn=new JButton("取消");
cancleBtn.addActionListener(this);
panel[3].add(OKBtn);
panel[3].add(cancleBtn); for(int i=0;i<4;i++)
con.add(panel[i]);
} public int showFontDialog()
{
setSize(300,300);
int x,y;
if (parent!=null)
{
x=parent.getX()+30;
y=parent.getY()+30;
}
else
{
x=150;
y=100;
}
setLocation(new Point(x,y));
setVisible(true);
return userSelect;
} public Font getFont()
{
return userFont;
} public void actionPerformed(ActionEvent e)
{
int styleIndex=Font.PLAIN,fontSize;
if(e.getSource()==OKBtn)
{
if(styleText.getText().equals("正常"))
styleIndex=Font.PLAIN;
if(styleText.getText().equals("斜体"))
styleIndex=Font.ITALIC;
if(styleText.getText().equals("粗体"))
styleIndex=Font.BOLD;
if(styleText.getText().equals("粗斜体"))
styleIndex=Font.BOLD | Font.ITALIC;
fontSize=Integer.parseInt(sizeText.getText());
userFont=new Font(nameText.getText(),styleIndex,fontSize);
userSelect=OK;
setVisible(false);
}
else
{
userSelect=Cancle;
setVisible(false);
}
} public void valueChanged(ListSelectionEvent e)
{
if (e.getSource()==nameList)
nameText.setText((String)nameList.getSelectedValue());
if (e.getSource()==styleList)
styleText.setText((String)styleList.getSelectedValue());
if (e.getSource()==sizeList)
sizeText.setText((String)sizeList.getSelectedValue());
}
}

运行截图:

  10.其他功能:

弹出式菜单

//创建弹出式菜单
public void createPopupMenu()
{
popMenu=new JPopupMenu();
popMenu.add("撤消");
popMenu.addSeparator();
popMenu.add("剪切");
popMenu.add("复制");
popMenu.add("粘贴");
popMenu.addSeparator();
popMenu.add("全选");
}

  然后用setComponentPopupMenu()为文本去加上这个菜单即可。

  至于复制、粘贴、全选、替换、获取时间/日期和自动换行等功能比较简单,就不累述了。

  本博客是参考相关的java资料,我们在大学学了很多种语言,要尝试着用不同的语言来实现,虽然思路是一样的,但是实现的过程中还是有相当部分不同的。当然,本例只是给出了纯文本编辑器,不能进行其他方面操作。其实本人也在想如果我们将编译原理的知识加进来,实现某种简单语言(如:PL/0语言)的词法分析、语法分析、语义分析等等编译过程,那么这个文本编辑器是否就称为某种语言的编辑器,能够实现编写和编译?本人觉得那应该是肯定的。

  敬请大神们指摘。。。。完毕。

  发布时忘记一件事,今天给出完整项目的导出包。可以在任何电脑上运行的。http://pan.baidu.com/s/1pLVac0F 对于其中的vbs脚本的编写知识,本人以前介绍过。http://www.cnblogs.com/czx1/p/5420208.html

JAVA/GUI程序之记事本的更多相关文章

  1. 使用exe4j把JAVA GUI程序打包成exe文件时遇到的问题

    1.把项目打包成jar文件时,只要勾选src目录就行了,其他的比如资源文件和jar包是不能添加进去的. 2.在D盘建一个文件夹,最好与项目同名,然后把打包好的jar包放进去,其他资源文件(图片之类的) ...

  2. 编写运行最简单的java程序——使用记事本编写java程序

    第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还没有搭建环境变量的小伙伴请转移到上一篇的随笔中去完成搭建. ...

  3. java的GUI程序的基本思路是以JFrame为基础

    JFrame – java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化.最小化.关闭. JPanel – Java图形用户界面(GUI)工具包swing中的面 ...

  4. java Gui编程 事件监听机制

    1.     GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式:   1. 命令交互方式    图书管理系统 ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. paip.java gui swt/jface 最佳实践

    paip.java gui swt/jface 最佳实践 1. 工具:Eclipse +jigloo4 1 2. 安装插件: 1 1. IMPORT swt lib 2 2. 新建立窗体 2 3. 运 ...

  7. Java应用程序的打包和发布

    Java应用程序的打包和发布 简化Java应用程序的打包和发布 发布Java应用程序时Java提供了一系列打包和发布工具,可以显著的简化发布过程 该文章提供了打包Java code的几种方法,探讨Ja ...

  8. java(课程设计之记事本界面部分代码公布)

    代码:涉及记事本的一些界面......!! /* *java课程设计之记事本(coder @Gxjun) * 编写一个记事本程序 * 要求: * 用图形用户界面实现. * 能实现编辑.保存.另存为.查 ...

  9. Java应用程序实现屏幕的"拍照"

    有时候,在Java应用程序开发中,如:远程监控或远程教学,常常需要对计算机的屏幕进行截取,由于屏幕截取是比较接近操作系统的操作,在Windows操作系统下,该操作几乎成了VC.VB等的专利,事实上,使 ...

随机推荐

  1. OpenSceneGraph in ActiveX by ActiveQt

    OpenSceneGraph in ActiveX by ActiveQt eryar@163.com Abstract. Qt’s ActiveX and COM support allows Qt ...

  2. .Net 分布式云平台基础服务建设说明概要

    1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根 ...

  3. 云瓣影音网站&&微信端(已开源)

    随着该项目的发布到线上(小打小闹),即将又要开启另一段崭新的旅程.强迫自己停下来写写所学所得,个人认为总结和分享是一种很棒的学习方式.那让我们先来瞧瞧项目长的什么样.如果着急要源码的朋友,可以下拉到最 ...

  4. EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    前言 Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不 ...

  5. SAP CRM 性能小技巧

    导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...

  6. Oracle SQL Developer 连接 MySQL

    1. 在ORACLE官网下载Oracle SQL Developer第三方数据库驱动 下载页面:http://www.oracle.com/technetwork/developer-tools/sq ...

  7. 企业shell面试题:获取51CTO博客列表倒序排序考试题

    #!/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HTMLFILE=/home/oldboy/ht ...

  8. 把int*传值给char*,打印出错误的数字

    首先进入debug模式查看i的地址也就是ptr的值 以16进制位小端模式存储(一个整型四个字节,8位16进制数)(根据系统位数情况) 紧接着因为ptr是char*型指针变量,读取数据时按照一个字节一个 ...

  9. U3D DrawCall优化手记

    在最近,使用U3D开发的游戏核心部分功能即将完成,中间由于各种历史原因,导致项目存在比较大的问题,这些问题在最后,恐怕只能通过一次彻底的重构来解决 现在的游戏跑起来会有接近130-170个左右的Dra ...

  10. Visual Studio Code,完美的编辑器

    今日凌晨,微软的文本(代码)编辑器 Visual Studio Code(简称 VS Code),发布了首个正式版,距离首个 beta 版上线时间刚好一年. 在十多年的编程经历中,我使用过非常多的的代 ...