自上半年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. await and async

    Most people have already heard about the new “async” and “await” functionality coming in Visual Stud ...

  2. iOS微信里打开app,Universal Links

    这两天在弄分享,从第三方应用或者浏览器打开自己app的东西 传统的方式是通过URL Scheme的方式,但是iOS9以后又出了新的更完美的方式Universal Links. 传统的URL Schem ...

  3. LINQ to SQL Where条件

    1. 适用场景 实现条件的过滤和查询等功能. 2. 说明 跟SQL语句中的where作用相似,都起到了范围的限定即过滤的作用,而判断条件是紧跟后面的条件子句.where主要分为三种形式:简单形式.条件 ...

  4. 使用JavaScript为一张图片设置备选路径

    在做网页开发的时候,有时候希望给图片设置一个备选路径,即,当src属性对应的主路径加载失败的时候,图片可以马上切换到备选路径.这样,即使主路径失效了,显示备用路径也不会影响网页的正常体验. 注意到网页 ...

  5. Android—关于自定义对话框的工具类

    开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...

  6. iOS之App Store上架被拒Legal - 5.1.5问题

    今天在看到App Store 上架过程中,苹果公司反馈的拒绝原因发现了这么一个问题: Legal - 5.1.5 Your app uses background location services ...

  7. npm源切换

    版权声明:欢迎转载,请附加转载来源:一路博客(http://www.16boke.com)   目录(?)[+] 安装 使用 列出可选的源 切换 增加源 删除源 测试速度 许可 项目主页   我们介绍 ...

  8. 机器学习之sklearn——EM

    GMM计算更新∑k时,转置符号T应该放在倒数第二项(这样计算出来结果才是一个协方差矩阵) from sklearn.mixture import GMM    GMM中score_samples函数第 ...

  9. 舍弃Nunit拥抱Xunit

    前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试框架的SetUp以及TearDown方法并不是显得那么完美,所以在公司内部的项目中采用了Xunit框架.那么究竟是什么样的原因 ...

  10. 浅谈浏览器http的缓存机制

    针对浏览器的http缓存的分析也算是老生常谈了,每隔一段时间就会冒出一篇不错的文章,其原理也是各大公司面试时几乎必考的问题. 之所以还写一篇这样的文章,是因为近期都在搞新技术,想“回归”下基础,也希望 ...