Thursday, January 22, 2009

教你新建别人进不了删不掉的文件夹

From: http://www.anzstockphoto.com/space.php?uid=3&do=blog&id=18

教你新建别人进不了删不掉的文件夹


建立一个别人既无法进入又无法删除的文件夹。相信大家都遇到过自己的一些隐私文件不愿意让别人看到的情况 吧,怎么解决呢?隐藏起来?换个名字?或者加密?这些办法都可以办到,其实还有一种方法,就是建立一个别人既不能进入又不能删除的文件夹,把自己的隐私文 件放进去,别人就看不到啦,下面讲讲如何实现,很简单的。
第一步:在运行中输入cmd,回车,打开命令行窗口
第二步:在命令行窗口中切换到想要建立文件夹的硬盘分区,如D盘,输入:d: 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛:K,i5m1d4v#D,s!U
第三步:输入md 123..\ 回车,注意文件夹名后有2个小数点
OK,搞定,看看你的D盘下面是不是多了一个名为123.的文件夹了?它是既不能进入又不能被删除的!不信你就试试看吧。 3M5X6h5V0Y2M7n/v/T [
那么,如果自己想删除或者进入这个文件夹,又应该如何操作呢?同样也很简单。 ]4o9K2L(B7n a$L7N
如果想删除,在命令行窗口中输入 rd 123..\ 回车,即可删除,当然删除前请确认里面的文件都是不需要的,不要删错了。 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛:a*\8A/K*o9X6F
如果想进入,在命令行窗口中输入 start d:\123..\ 注意这里一定要是文件夹的绝对路径,否则无法打开即可打开此文件夹,你就可以随心所欲的把不想让别人看到的资料放进去啦!

Thursday, January 15, 2009

提高Java代码可重用性的三个措施

From: http://www.java114.com/278/content4210.html


提高Java代码可重用性的三个措施
 本文介绍了三种修改现有代码提高其可重用性的方法,它们分别是:改写类的实例方法,把参数类型改成接口,选择最简单的参数接口类型。  

措施一:改写类的实例方法  通过类继承实现代码重用不是精确的代码重用技术,因此它并不是最理想的代码重用机制。换句话说,如果不继承整个类的所有方法和数据成员,我们无法重用该类里面的单个方法。继承总是带来一些多余的方法和数据成员,它们总是使得重用类里面某个方法的代码复杂化。另外,派生类对父类的依赖关系也使得代码进一步复杂化:对父类的改动可能影响子类;修改父类或者子类中的任意一个类时,我们很难记得哪一个方法被子类覆盖、哪一个方法没有被子类覆盖;最后,子类中的覆盖方法是否要调用父类中的对应方法有时并不显而易见。  任何方法,只要它执行的是某个单一概念的任务,就其本身而言,它就应该是首选的可重用代码。为了重用这种代码,我们必须回归到面向过程的编程模式,把类的实例方法移出成为全局性的过程。为了提高这种过程的可重用性,过程代码应该象静态工具方法一样编写:它只能使用自己的输入参数,只能调用其他全局性的过程,不能使用任何非局部的变量。这种对外部依赖关系的限制简化了过程的应用,使得过程能够方便地用于任何地方。当然,由于这种组织方式总是使得代码具有更清晰的结构,即使是不考虑重用性的代码也同样能够从中获益。  在Java中,方法不能脱离类而单独存在。为此,我们可以把相关的过程组织成为独立的类,并把这些过程定义为公用静态方法。  例如,对于下面这个类:  class Polygon {  .   .   public int getPerimeter() {...}   public boolean isConvex() {...}  public boolean containsPoint(Point p) {...}   .   .   }   我们可以把它改写成:  class Polygon {  .   .   public int getPerimeter() {return pPolygon.computePerimeter(this);}  public boolean isConvex() {return pPolygon.isConvex(this);}   public boolean containsPoint(Point p) {return pPolygon.containsPoint(this, p);}   .  }   其中,pPolygon是:  class pPolygon {   static public int computePerimeter(Polygon polygon) {...}   static public boolean isConvex(Polygon polygon) {...}   static public boolean   containsPoint(Polygon polygon, Point p) {...}   }   从类的名字pPolygon可以看出,该类所封装的过程主要与Polygon类型的对象有关。名字前面的p表示该类的唯一目的是组织公用静态过程。在Java中,类的名字以小写字母开头是一种非标准的做法,但象pPloygon这样的类事实上并不提供普通Java类的功能。也就是说,它并不代表着一类对象,它只是Java语言组织代码的一种机制。  在上面这个例子中,改动代码的最终效果是使得应用Polygon功能的客户代码不必再从Polygon继承。Polygon类的功能现在已经由pPolygon类以过程为单位提供。客户代码只使用自己需要的代码,无需关心Polygon类中自己不需要的功能。但它并不意味着在这种新式过程化编程中类的作用有所削弱。恰恰相反,在组织和封装对象数据成员的过程中,类起到了不可或缺的作用,而且正如本文接下来所介绍的,类通过多重接口实现多态性的能力本身也带来了卓越的代码重用支持。然而,由于用实例方法封装代码功能并不是首选的代码重用手段,所以通过类继承达到代码重用和多态性支持也不是最理想的。  

措施二:把参数类型改成接口  正如Allen Holub在《Build User Interfaces for Object-Oriented Systems》中所指出的,在面向对象编程中,代码重用真正的要点在于通过接口参数类型利用多态性,而不是通过类继承:  “……我们通过对接口而不是对类编程达到代码重用的目的。如果某个方法的所有参数都是对一些已知接口的引用,那么这个方法就能够操作这样一些对象:当我们编写方法的代码时,这些对象的类甚至还不存在。从技术上说,可重用的是方法,而不是传递给方法的对象。”  在“措施一”得到的结果上应用Holub的看法,当某块代码能够编写为独立的全局过程时,只要把它所有类形式的参数改为接口形式,我们就可以进一步提高它的可重用能力。经过这个改动之后,过程的参数可以是实现了该接口的所有类的对象,而不仅仅是原来的类所创建的对象。由此,过程将能够对可能存在的大量的对象类型进行操作。  例如,假设有这样一个全局静态方法:  static public boolean contains(Rectangle rect, int x, int y) {...}   这个方法用于检查指定的点是否包含在矩形里面。在这个例子中,rect参数的类型可以从Rectangle类改变为接口类型,如下所示:  static public boolean contains(Rectangular rect, int x, int y) {...}   而Rectangular接口的定义是:  public interface Rectangular {Rectangle getBounds();}   现在,所有可以描述为矩形的类(即,实现了Rectangular接口的类)所创建的对象都可以作为提供给pRectangular.contains()的rect参数。通过放宽参数类型的限制,我们使方法具有更好的可重用性。  不过,对于上面这个例子,Rectangular接口的getBounds方法返回Rectangle,你可能会怀疑这么做是否真正值得。换言之,如果我们知道传入过程的对象会在被调用时返回一个Rectangle,为什么不直接传入Rectangle取代接口类型呢?之所以不这么做,最重要的原因与集合有关。让我们假设有这样一个方法:  static public boolean areAnyOverlapping(Collection rects) {...}   该方法用于检查给定集合中的任意矩形对象是否重叠。在这个方法的内部,当我们用循环依次访问集合中的各个对象时,如果我们不能把对象cast成为Rectangular之类的接口类型,又如何能够访问对象的矩形区域呢?唯一的选择是把对象cast成为它特有的类形式(我们知道它有一个方法可以返回矩形),它意味着方法必须事先知道它所操作的对象类型,从而使得方法的重用只限于那几种对象类型。而这正是前面这个措施力图先行避免的问题!  


措施三:选择最简单的参数接口类型  在实施第二个措施时,应该选用哪一种接口类型来取代给定的类形式?答案是哪一个接口完全满足过程对参数的需求,同时又具有最少的多余代码和数据。描述参数对象要求的接口越简单,其他类实现该接口的机会就越大——由此,其对象能够作为参数使用的类也越多。从下面这个例子可以很容易地看出这一点:  static public boolean areOverlapping(Window window1, Window window2) {...}   这个方法用于检查两个窗口(假定是矩形窗口)是否重叠。如果这个方法只要求从参数获得两个窗口的矩形坐标,此时相应地简化这两个参数是一种更好的选择:  static public boolean areOverlapping(Rectangular rect1, Rectangular rect2) {...}   上面的代码假定Window类型实现了Rectangular接口。经过改动之后,对于任何矩形对象我们都可以重用该方法的功能。  有些时候可能会出现描述参数需求的接口拥有太多方法的情况。此时,我们应该在全局名称空间中定义一个新的公共接口供其他面临同一问题的代码重用。  当我们需要象使用C语言中的函数指针一样使用参数时,创建唯一的接口描述参数需求是最好的选择。例如,假设有下面这个过程:  static public void sort(List list, SortComparison comp) {...}   该方法运用参数中提供的比较对象comp,通过比较给定列表list中的对象排序list列表。sort对comp对象的唯一要求是要调用一个方法进行比较。因此,SortComparison应该是只带有一个方法的接口:  public interface SortComparison {  boolean comesBefore(Object a, Object b);  }   SortComparison接口的唯一目的在于为sort提供一个它所需功能的钩子,因此SortComparison接口不能在其他地方重用。  总而言之,本文三个措施适合于改造现有的、按照面向对象惯例编写的代码。这三个措施与面向对象编程技术结合就得到了一种可在以后编写代码时使用的新式代码编写技术,它能够简化方法的复杂性和依赖关系,同时提高方法的可重用能力和内部凝聚力。  当然,这里的三个措施不能用于那些天生就不适合重用的代码。不适合重用的代码通常出现在应用的表现层。例如,创建程序用户界面的代码,以及联结到输入事件的控制代码,都属于那种在程序和程序之间千差万别的代码,这种代码几乎不可能重用。

Thursday, January 8, 2009

Java - GUI development using Eclipse IDE




under eclipse Java is using SWT for GUI development.

http://www.eclipse.org/swt/

Following is a small sample code to demostrate how to use SWT under eclipse to develop GUI using java. Also, it tells how to run your java class under ms-dos command line.

==== CablePowerView.java =============

import org.eclipse.swt.widgets.*;

public class CablePowerView {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("Cable Power Viewer Started!");
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Swt working!");
shell. setSize(500, 375);
shell.open();
while(!shell.isDisposed()) if (!display.readAndDispatch()) display.sleep();
display.dispose();
}
}
====== antbuild.xml ===========

Screen shot for antbuild.xml is attached as *.xml can not be displayed properly in the blog.

====== Run it in command line ============

1. From http://www.eclipse.org/swt/
We download SWT Stable Version for Windows (3.4 Final Release - 19 June 2008) swt-3.4-win32-win32-x86.zip
unzip we get swt.jar, then unzip swt.jar we get swt-win32-3448.dll.
2. creat run.bat as follows:
chdir .\CablePowerView\build
java -classpath .\swt.jar; -Djava.library.path=.\ CablePowerView
(Note: swt.jar, swt-win32-3448.dll are stored together with CalbePowerView.class under .\CablePowerView\build
run.bat is stored at root directory
.\ -Djava.library.path=.\ use to tell where swt-win32-3448.dll stored.)
Ms-Dos> run.bat
you will see the result that one window popped up. : - )

Wednesday, January 7, 2009

Java - Serial port communication

1. Java Development Environment set up under winxp.

a. download Eclipse IDE (Eclipse IDE for Java Developers (85 MB)) from
http://www.eclipse.org/downloads/
b. download JDK (Java SE Development Kit (JDK) 6 Update 11 72.9MB) from
http://java.sun.com/javase/downloads/?intcmp=1281

Installing JavaVM (JDK,JRE), and IDE.
The JDK files are placed at C:\Program Files\Java\jdk1.6.0_11\ and the runtime files are placed at C:\Program Files\Java\jdk1.6.0_11\. Ensure the System Variable "path" (held in My Computer->properties->Advanced->Environment Varables->System Variables) includes ";C:\Program Files\Java\jdk1.6.0_11\bin" at the end.

"C:\Program Files\Java\jre6" have JRE installed.

2. Download 'RXTX-2.1-7r2(stable) Binary rxtx-2.1-7-bins-r2.zip ' zip file from
http://www.rxtx.org/ wiki

a. Install RXTX
This involves placing rxtxSerial.dll and rxtxParallell.dll in both C:\Program Files\Java\jdk1.6.0_11\jre\bin and C:\Program Files\Java\jre6\bin. It also involves placing RXTXcomm.jar in both C:\Program Files\Java\jdk1.6.0_11\jre\lib\ext and C:\Program Files\Java\jre6\lib\ext.

b. Example is in link path: usage(Using RXTX)->Code Examples->Writing "Hello World" to a USB to serial converter

This example shows how write a Java program to write out "Hello World" to a serial port or to a USB to serial converter. Before you start you will need to ensure that a suitable Java VM is installed, along with the RXTX Libraries (see platform specifc instructions below).
These instructions all make use of the SimpleWrite.java example file, which you will need to download.


This Java program can be compiled and run by typing the following from the command line:
D:\MyDocXp\MyJavaEclipse\HelloWorld\src> javac SimpleWrite.java
D:\MyDocXp\MyJavaEclipse\HelloWorld\src>java SimpleWrite

"Hello World" should then appear on the device connected to the serial port, assuming that it has been set up to receive a 19200 baud rate, 8 data bits, 1 stop bit, no parity and no handshaking.


c. SimpleWrite.java

import java.io.*;
import java.util.*;
//import javax.comm.*;
import gnu.io.*;
/** * Class declaration * * * @author * @version 1.10, 08/04/00 */public class SimpleWrite { static Enumeration portList;
static CommPortIdentifier portId;
static String messageString = "Hello, world!";
static SerialPort serialPort;
static OutputStream outputStream;
static boolean outputBufferEmptyFlag = false;
/** * Method declaration * * * @param args * * @see */ public static void main(String[] args) { boolean portFound = false;
//String defaultPort = "/dev/term/a";
String defaultPort = "COM4";
if (args.length > 0) { defaultPort = args[0];
}
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals(defaultPort)) { System.out.println("Found port " + defaultPort);
portFound = true;
try { serialPort = (SerialPort) portId.open("SimpleWrite", 2000);
} catch (PortInUseException e) { System.out.println("Port in use.");
continue;
}
try { outputStream = serialPort.getOutputStream();
} catch (IOException e) {}
try { serialPort.setSerialPortParams(19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
try { serialPort.notifyOnOutputEmpty(true);
} catch (Exception e) { System.out.println("Error setting event notification");
System.out.println(e.toString());
System.exit(-1);
}
System.out.println( "Writing \""+messageString+"\" to " +serialPort.getName());
try { outputStream.write(messageString.getBytes());
} catch (IOException e) {}
try { Thread.sleep(2000); // Be sure data is xferred before closing } catch (Exception e) {} serialPort.close();
System.exit(1);
} } }
if (!portFound) { System.out.println("port " + defaultPort + " not found.");
} }
}

struts开发实践—曲线图实例

From: http://www.7880.com/Info/Article-456d7000.html

本案主要功能是完成曲线图的绘制,并将曲线图生成jpg图形并显示。
1。画图的主要函数说明
Graphics g
g.drawRect(x_top,x_bottom,width,height):画矩形
g.setColor(color):指定颜色;
g.fillRect(x_top,x_bottom,width,height):画填充的矩形//
g.drawRoundRect(x_top,x_bottom,width,height):画圆边矩形
g.fillRoundRect(x_top,x_bottom,width,height):画一个填充的圆边矩形
g.drawArc(beg_x,beg_y,width,height,beg_tangle,end_tangle):画弧线
g.fillArc(beg_x,beg_y,width,height,beg_tangle,end_tangle):填充弧
g.drawLine(beg_x,beg_y,end_x,end_y):画一条直线
g.drawString(theString,stringTopLeft_x,StringTopLeft_y):画字
g.setFont(font):设置画笔的字体
g.setPaint(color):设置画笔的颜色
2。曲线图绘制文件
/*****************program CurveFrame begin************************/
package test;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.swing.JFrame;
import java.lang.Math;
/** *曲线图绘制 */
public class CurveFrame
extends JFrame {
/**数据*/
private double[] result;
/**数据项名称*/
private String[] title;
/**参数:结果集,名称集*/
public CurveFrame(double[] result, String[] title) {
this.result = result;
this.title = title;
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Dimension dim = this.getSize();
g2.setColor(Color.white);
g2.fillRect(0, 0, dim.width, dim.height);
//写title;
Font font = g2.getFont().deriveFont(12.0f);
g2.setFont(font);
FontMetrics metrics = g2.getFontMetrics();
g2.setPaint(Color.black);
g2.drawString(title[0], (dim.width - title[0].length() * 5) / 2, 10);
// draw the x and y axis
g2.setStroke(new BasicStroke(2.0f));
g2.draw(new Line2D.Double(40, 30, 40, dim.height - 30));
g2.draw(new Line2D.Double(40, dim.height - 30,
dim.width - 20, dim.height - 30));
long unit=(Math.round((result[0]+750)/1500))*50;
long yMax = result[0] == 0 ? unit : Math.round((result[0]+unit/2)/unit) * unit;
int widthPer = (dim.width - 40) / result.length;
long heightPer = (dim.height - 60) / (yMax / unit);
//draw the y axis scale;
g2.setPaint(Color.lightGray);
g2.setStroke(new BasicStroke(1.0f));
for (int i = 0; i<=yMax / unit; i++) {
g2.draw(new Line2D.Double(40, dim.height - 30 - i * heightPer,
dim.width - 40, dim.height - 30 - i * heightPer));
String ylabel = String.valueOf(i * unit);
g2.drawString(ylabel, 35 - metrics.stringWidth(ylabel),
dim.height - 30 - (i * heightPer));
}
//draw x title;
GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD,
result.length - 2);
for (int i = 1; i < result.length; i++) {
//draw x scale;
g2.setPaint(Color.lightGray);
g2.setStroke(new BasicStroke(1.0f));
g2.draw(new Line2D.Double(40 + (i - 1) * widthPer, dim.height - 30,
40 + (i - 1) * widthPer,30));
font = g2.getFont().deriveFont(10.0f);
g2.setFont(font);
g2.setPaint(Color.black);
g2.drawString(title[i], 40 + widthPer * (i - 1)-metrics.stringWidth(title[i])/2, dim.height - 10);
g2.setPaint(Color.red);
g2.setStroke(new BasicStroke(2.0f));
if (i == 1) {
path.moveTo(40,
Math.round(dim.height - 30 -
(result[i] / unit) * heightPer));
}
else {
path.lineTo(Math.round(widthPer * (i - 1)) + 40,
Math.round(dim.height - 30 -
(result[i] / unit) * heightPer));
}
}
g2.draw(path);
}

}
/*****************program end************************/
3。生成jpg图形并显示
/*****************program begin************************/
package test;

import org.apache.struts.action.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.util.*;

import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;


/**
* 变化曲线
*/
public class WageChangeCurveAction
extends Action {
private static final String CONTENT_TYPE = "image/gif";
private static final int WIDTH = 700;
private static final int HEIGHT = 500;
public ActionForward perform(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws IOException,
ServletException {
response.setContentType(CONTENT_TYPE);
ServletOutputStream out = response.getOutputStream();
double[] result=。。。String[] title = 。。。//获得图形数据
try {
CurveFrame dummy = new CurveFrame(result,title);
dummy.setSize(new Dimension(WIDTH, HEIGHT));
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
dummy.paint(g2);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.flush();
}
catch (Throwable e) {
e.printStackTrace();
}
return mapping.findForward("success");
}

}
/*****************program end************************/

Tuesday, January 6, 2009

Java IDE选择

From: http://www.knowsky.com/362256.html

随着Java应用程序越做越大、越做越复杂。Java IDE在其中所起的作用也日益显著。有了Java IDE,使软件的生产率倍增。但目前Java IDE的种类繁多,功能也各不相同。这就给我们的选择带来了诸多不便。因此,本文就目前比较流行的几种Java IDE做了一个深入的对比。主要比较4种Java IDE,它们是Eclipse、Netbeans、Jbuilder和Jcreator。本文将从以下8个方面进行探讨。   一、 Java IDE介绍   1. Eclipse   Eclipse是一个非常成功的开源项目。在世纪之交的时候,IBM为了对抗微软越来越强的垄断地位,投入了10亿美元进行Linux、pc、笔记本电脑以及服务器等产品的研发。在这一系列举措中,影响最深远的就是Eclipse。   Eclipse是IBM“日独计划”的产物。在2001年6月,IBM将价值4000万美元的Eclipse捐给了开源组织。Eclipse由四个计划组成:Eclipse Project、Eclipse Tools Project、Eclipse Technology Project和Eclipse Web Tools Platform Project。每一个计划都遵照CPL1.0协议发布。经过几年的发展,Eclipse已经成为目前最流行的Java IDE。并且拥有了很多的Eclipse社区和新闻组。目前,Eclipse已经成为开发Java程序的首选IDE。   2. Netbeans   Netbeans是Sun自己的开源Java IDE。随着Eclipse逐渐兴起,Sun也在试探性地向Eclipse靠拢。但同时又在不移余力地开发自己的Java IDE:Netbeans。Netbeans在功能上和Eclipse类似。但和Eclipse也有一此区别。如Netbeans集成了Web开发以及最近流行的ajax,而Eclipse要想达到这一点,必须得安装其它的第三方插件。还有Eclipse鼓励使用SWT做为Java的GUI库,而Netbeans使用的是更纯正的Java GUI库:Swing/AWT。   3.Jbuilder   Jbuilder是Borland开发的Java IDE。它在Eclipse和Netbeans出现之前是非常流行了。原因很简单,因为那时Jbuilder是唯一能够真正称得上IDE的产品。但在 Eclipse和Netbeans出现之后Jbuilder就每况愈下。发生这种情况的原因很多。可能是因为Jbuilder是收费的,而Eclipse 和Netbeans是免费的;也可能是因为Borland的产品有一个最大的缺点。就是不管功能多强,而它的代码编辑器和其它辅助书写代码的工具差不多未发生什么变化。从Jbuilder2和Jbuilder9似乎都差不多。   4. Jcreator   以上介绍的都是大家伙。而Jcreator则是一个轻量型的Java IDE。它的功能非常单一。最核心的功能就是可能编写Java源程序,并且支持代码变色和code complete。但Jcreator有一个最显著的优点。就是运行速度快,并且占用资源少。这主要是因为Eclipse、Netbeans和 Jbuilder本身都是使用Java编写的。在启动时必须得先启动Java虚拟机。而Jcreator使用的是本地代码。因而速度更快。假如你的机器配置不高(如只有64M或128M内存),还是使用Jcreator为好。
  二、 Java IDE是否能跨平台 由于Java是跨平台的,因此,它的IDE最好也能跨平台。由于Eclipse、Netbeans和Jbuilder都是使用Java编写的,因此它们也是跨平台的。但由于Eclipse采用的GUI接口是 SWT。而这个库并未加入Sun JCP。因此,Eclipse的跨平台要受到SWT的限制,即SWT所能跨的平台数也就是Eclipse所跨的平台数。而对于Jcreator来说,目前只有Windows版本。这也不能不说是一个遗憾。不过由于大多数的Java开发都是在Windows上,因此。支持Windows平台是几乎是所有的 Java IDE最先考虑的事情。   三、 Java IDE是否收费   这个问题是决定一个IDE是否能够流行的重要原因之一。众所周知,假如一个软件是收费的,那么获得这个软件的方法一般有两种。一种是购买正版的软件。另一种就是使用盗版的软件。而在一些对盗版打击很严厉的国家可能使用正版软件就成为最佳的选择。然而,使用正版软件将会带来很大的成本。所以一但有一种或几种免费的软件,并且在功能上足可以取代收费软件时,人们就会马上转向这些免费的软件。在上述的4种Java IDE中Eclipse和Netbeans不仅是完全免费的,而且是开源的。因此,它们一出现,就对收费Jbuilder产生了很大的威胁。目前 Eclipse和Netbeans的使用率已经超过了Jbuilder。而Jcreator虽然也是收费的。但是费用也并不高。因此,以Jcreator 为首的一些小型的Java IDE以其体积小,占用系统资源少等优点也会占有一定的比例(尽管这个比例并不大)。   四、 Java IDE的界面友好程度   界面是否友好是决定一个IDE是否成功的另一个重要原因。对于界面来说,Eclipse和Netbeans差不多。只是Eclipse是使用SWT开发的。因此,它的界面看起来更像是本地的程序。而Netbeans的界面风格是Java的标准风格。