我想找回这个手机以前的微信朋友圈找回

在C/C++中调用Java 通过本地GUI程序一个命令窗口直接启动Java程序-android100学习网
在C/C++中调用Java 通过本地GUI程序一个命令窗口直接启动Java程序
java跨平台的特性使Java越来越受开发人员的欢迎,但也往往会听到不少的抱怨:用Java开发的图形用户窗口界面每次在启动的时候都会跳出一 个控制台窗口,这个控制台窗口让本来非常棒的界面失色不少。怎么能够让通
java跨平台的特性使Java越来越受开发人员的欢迎,但也往往会听到不少的抱怨:用Java开发的图形用户窗口界面每次在启动的时候都会跳出一 个控制台窗口,这个控制台窗口让本来非常棒的界面失色不少。怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢?其实现在很多流行的开 发环境例如JBuilder、Eclipse都是使用纯Java开发的集成环境。这些集成环境启动的时候并不会打开一个命令窗口,因为它使用了 JNI(Java Native Interface)的技术。通过这种技术,开发人员不一定要用命令行来启动Java程序,可以通过编写一个本地GUI程序直接启动Java程序,这样就 可避免另外打开一个命令窗口,让开发的Java程序更加专业。
  JNI答应运行在虚拟机的Java程序能够与其它语言(例如C和C++)编写的程序或者类库进行相互间的调用。同时JNI提供的一整套的 API,答应将Java虚拟机直接嵌入到本地的应用程序中。图1是Sun站点上对JNI的基本结构的描述。
  本文将介绍如何在C/C++中调用Java方法,并结合可能涉及到的问题介绍整个开发的步骤及可能碰到的难题和解决方法。本文所采用的工具是 Sun公司创建的 Java Development Kit (JDK) 版本 1.3.1,以及微软公司的Visual C++ 6开发环境。
  环境搭建
  为了让本文以下部分的代码能够正常工作,我们必须建立一个完整的开发环境。首先需要下载并安装JDK 1.3.1,其下载地址为&&。假设安装路径为C:JDK。下一步就是设置集成开发环境,通过Visual C++ 6的菜单Tools&Options打开选项对话框如图2。
  将目录C:JDKinclude和C:JDKincludewin32加入到开发环境的Include Files目录中,同时将C:JDKlib目录添加到开发环境的Library Files目录中。这三个目录是JNI定义的一些常量、结构及方法的头文件和库文件。集成开发环境已经设置完毕,同时为了执行程序需要把Java虚拟机所 用到的动态链接库所在的目录C:JDK jreinclassic设置到系统的Path环境变量中。这里需要提出的是,某些开发人员为了方便直接将JRE所用到的DLL文件直接拷贝到系统目录 下。这样做是不行的,将导致初始化Java虚拟机环境失败(返回值-1),原因是Java虚拟机是以相对路径来寻找所用到的库文件和其它一些相关文件的。 至此整个JNI的开发环境设置完毕,为了让此次JNI旅程能够顺利进行,还必须先预备一个Java类。在这个类中将用到Java中几乎所有有代表性的属性 及方法,如静态方法与属性、数组、异常抛出与捕捉等。我们定义的Java程序(Demo.java)如下,本文中所有的代码演示都将基于该Java程序, 代码如下:
  package jni. /** * 该类是为了演示JNI如何访问各种对象属性等 * @author liudong */ public class Demo { //用于演示如何访问静态的基本类型属性 public static int COUNT = 8; //演示对象型属性 public S PRivate int[] public Demo() { this(&缺省构造函数&); } /** * 演示如何访问构造器 */ public Demo(String msg) { System.out.println(&:& + msg); this.msg = this.counts = } /** * 该方法演示如何访问一个访问以及中文字符的处理 */ public String getMessage() { } /** * 演示数组对象的访问 */ public int[] getCounts() { } /** * 演示如何构造一个数组对象 */ public void setCounts(int[] counts) { this.counts = } /** * 演示异常的捕捉 */ public void throwExcp() throws IllegalaccessException { throw new IllegalAccessException(&exception occur.&); } }
  初始化虚拟机
  本地代码在调用Java方法之前必须先加载Java虚拟机,而后所有的Java程序都在虚拟机中执行。为了初始化Java虚拟机,JNI提供了 一系列的接口函数Invocation API。通过这些API可以很方便地将虚拟机加载到内存中。创建虚拟机可以用函数 jint JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args)。对于这个函数有一点需要注重的是,在JDK 1.1中第三个参数总是指向一个结构JDK1_ 1InitArgs, 这个结构无法完全在所有版本的虚拟机中进行无缝移植。在JDK 1.2中已经使用了一个标准的初始化结构JavaVMInitArgs来替代JDK1_1InitArgs。下面我们分别给出两种不同版本的示例代码。
  在JDK 1.1初始化虚拟机:
  #include int main() { JNIEnv * JavaVM * JDK1_1InitArgs vm_ /* IMPORTANT: 版本号设置一定不能漏 */ vm_args.version = 0x; /*获取缺省的虚拟机初始化参数*/ JNI_GetDefaultJavaVMInitArgs(&vm_args); /* 添加自定义的类路径 */ sprintf(classpath, &%s%c%s&, vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH); vm_args.classpath = /*设置一些其他的初始化参数*/ /* 创建虚拟机 */ res = JNI_CreateJavaVM(&jvm,&env,&vm_args); if (res & 0) { fprintf(stderr, &Can't create Java VM &); exit(1); } /*释放虚拟机资源*/ (*jvm)-&DestroyJavaVM(jvm); }
  JDK 1.2初始化虚拟机:
  /* invoke2.c */ #include int main() { JavaVM * JNIEnv * JavaVMInitArgs vm_ JavaVMOption options[3]; vm_args.version=JNI_VERSION_1_2;//这个字段必须设置为该值 /*设置初始化参数*/ options[0].optionString = &-piler=NONE&; options[1].optionString = &-Djava.class.path=.&; options[2].optionString = &-verbose:jni&;//用于跟踪运行时的信息 /*版本号设置不能漏*/ vm_args.version = JNI_VERSION_1_2; vm_args.nOptions = 3; vm_args.options = vm_args.ignoreUnrecognized = JNI_TRUE; res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (res & 0) { fprintf(stderr, &Can't create Java VM &); exit(1); } (*jvm)-&DestroyJavaVM(jvm); fprintf(stdout, &Java VM destory. &); }
  为了保证JNI代码的可移植性,建议使用JDK 1.2的方法来创建虚拟机。JNI_CreateJavaVM函数的第二个参数JNIEnv *env,就是贯穿整个JNI始末的一个参数,因为几乎所有的函数都要求一个参数就是JNIEnv *env。
  访问类方法
  初始化了Java虚拟机后,就可以开始调用Java的方法。要调用一个Java对象的方法必须经过几个步骤:
  1.获取指定对象的类定义(jclass)
  有两种途径来获取对象的类定义:第一种是在已知类名的情况下使用FindClass来查找对应的类。但是要注重类名并不同于平时写的Java代 码,例如要得到类jni.test.Demo的定义必须调用如下代码:
  jclass cls = (*env)-&FindClass(env, &jni/test/Demo&);//把点号换成斜杠
  然后通过对象直接得到其所对应的类定义:
  jclass cls = (*env)-& GetObjectClass(env, obj); //其中obj是要引用的对象,类型是jobject
  2.读取要调用方法的定义(jmethodID)
  我们先来看看JNI中获取方法定义的函数:
  jmethodID (JNICALL *GetMethodID)(JNIEnv *env, jclass clazz, const char *name, const char *sig); jmethodID (JNICALL *GetStaticMethodID)(JNIEnv *env, jclass class, const char *name, const char *sig);
  这两个函数的区别在于GetStaticMethodID是用来获取静态方法的定义,GetMethodID则是获取非静态的方法定义。这两个 函数都需要提供四个参数:env就是初始化虚拟机得到的JNI环境;第二个参数class是对象的类定义,也就是第一步得到的第三个参数是方法名 称;最重要的是第四个参数,这个参数是方法的定义。因为我们知道Java中答应方法的多态,仅仅是通过方法名并没有办法定位到一个具体的方法,因此需要第 四个参数来指定方法的具体定义。但是怎么利用一个字符串来表示方法的具体定义呢?JDK中已经预备好一个反编译工具javap,通过这个工具就可以得到类 中每个属性、方法的定义。下面就来看看jni.test.Demo的定义:
  打开命令行窗口并运行 javap -s -p jni.test.Demo 得到运行结果如下:
  Compiled from Demo.java public class jni.test.Demo extends java.lang.Object { public static int COUNT; /* I */ public java.lang.S /* Ljava/lang/S */ private int counts[]; /* [I */ public jni.test.Demo(); /* ()V */ public jni.test.Demo(java.lang.String); /* (Ljava/lang/S)V */ public java.lang.String getMessage(); /* ()Ljava/lang/S */ public int getCounts()[]; /* ()[I */ public void setCounts(int[]); /* ([I)V */ public void throwExcp() throws java.lang.IllegalAccessE /* ()V */ static {}; /* ()V */ }
  我们看到类中每个属性和方法下面都有一段注释。注释中不包含空格的内容就是第四个参数要填的内容(关于javap具体参数请查询JDK的使用帮 助)。下面这段代码演示如何访问jni.test.Demo的getMessage方法:
  /* 假设我们已经有一个jni.test.Demo的实例obj */ jmethodID jclass cls = (*env)-& GetObjectClass (env, obj);//获取实例的类定义 mid=(*env)-&GetMethodID(env,cls,&getMessage&,& ()Ljava/lang/S &); /*假如mid为0表示获取方法定义失败*/ jstring msg = (*env)-& CallObjectMethod(env, obj, mid); /* 假如该方法是静态的方法那只需要将最后一句代码改为以下写法即可: jstring msg = (*env)-& CallStaticObjectMethod(env, cls, mid); */
  3.调用方法
  为了调用对象的某个方法,可以使用函数CallMethod或者CallStaticMethod(访问类的静态方法),根据不同的返回类型而 定。这些方法都是使用可变参数的定义,假如访问某个方法需要参数时,只需要把所有参数按照顺序填写到方法中就可以。在讲到构造函数的访问时,将演示如何访 问带参数的构造函数。
  访问类属性
  访问类的属性与访问类的方法大体上是一致的,只不过是把方法变成属性而已。
  1.获取指定对象的类(jclass)
  这一步与访问类方法的第一步完全相同,具体使用参看访问类方法的第一步。
  2.读取类属性的定义(jfieldID)
  在JNI中是这样定义获取类属性的方法的:
  jfieldID (JNICALL *GetFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig); jfieldID (JNICALL *GetStaticFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
  这两个函数中第一个参数为JNI环境;clazz为类的定义;name为属性名称;第四个参数同样是为了表达属性的类型。前面我们使用 javap工具获取类的具体定义的时候有这样两行:
  public java.lang.S /* Ljava/lang/S */
  其中第二行注释的内容就是第四个参数要填的信息,这跟访问类方法时是相同的。
  3.读取和设置属性值
  有了属性的定义要访问属性值就很轻易了。有几个方法用来读取和设置类的属性,它们是:GetField、SetField、 GetStaticField、SetStaticField。比如读取Demo类的msg属性就可以用GetObjectField,而访问COUNT 用GetStaticIntField,相关代码如下:
  jfieldID field = (*env)-&GetFieldID(env,obj,&msg&,& Ljava/lang/S&); jstring msg = (*env)-& GetObjectField(env, cls, field);//msg就是对应Demo的msg jfieldID field2 = (*env)-&GetStaticFieldID(env,obj,&COUNT&,&I&); jint count = (*env)-&GetStaticIntField(env,cls,field2);
  访问构造函数
  很多人刚刚接触JNI的时候往往会在这一节碰到问题,查遍了整个jni.h看到这样一个函数NewObject,它应该是可以用来访问类的构造 函数。但是该函数需要提供构造函数的方法定义,其类型是jmethodID。从前面的内容我们知道要获取方法的定义首先要知道方法的名称,但是构造函数的 名称怎么来填写呢?其实访问构造函数与访问一个普通的类方法大体上是一样的,惟一不同的只是方法名称不同及方法调用时不同而已。访问类的构造函数时方法名 必须填写&&。下面的代码演示如何构造一个Demo类的实例:
  jclass cls = (*env)-&FindClass(env, &jni/test/Demo&); /** 首先通过类的名称获取类的定义,相当于Java中的Class.forName方法 */ if (cls == 0) jmethodID mid = (*env)-&GetMethodID(env,cls,&&,&(Ljava/lang/S)V &); if(mid == 0) jobject demo = jenv-&NewObject(cls,mid,0); /** 访问构造函数必须使用NewObject的函数来调用前面获取的构造函数的定义 上面的代码我们构造了一个Demo的实例并传一个空串null */
  数组处理
  创建一个新数组
  要创建一个数组,我们首先应该知道数组元素的类型及数组长度。JNI定义了一批数组的类型jArray及数组操作的函数NewArray,其中 就是数组中元素的类型。例如,要创建一个大小为10并且每个位置值分别为1-10的整数数组,编写代码如下:
  int i = 1; jintA//定义数组对象 (*env)-& NewIntArray(env, 10); for(; i&= 10; i++) (*env)-&SetIntArrayRegion(env, array, i-1, 1, &i);
  访问数组中的数据
  访问数组首先应该知道数组的长度及元素的类型。现在我们把创建的数组中的每个元素值打印出来,代码如下:
   /* 获取数组对象的元素个数 */ int len = (*env)-&GetArrayLength(env, array); /* 获取数组中的所有元素 */ jint* elems = (*env)-& GetIntArrayElements(env, array, 0); for(i=0; i& i++) printf(&ELEMENT %d IS %d &, i, elems[i]);
  中文处理
  中文字符的处理往往是让人比较头疼的事情,非凡是使用Java语言开发的软件,在JNI这个问题更加突出。由于Java中所有的字符都是 Unicode编码,但是在本地方法中,例如用VC编写的程序,假如没有非凡的定义一般都没有使用Unicode的编码方式。为了让本地方法能够访问 Java中定义的中文字符及Java访问本地方法产生的中文字符串,我定义了两个方法用来做相互转换。
  & 方法一,将Java中文字符串转为本地字符串
  /** 第一个参数是虚拟机的环境指针第二个参数为待转换的Java字符串定义第三个参数是本地存储转换后字符串的内存块第三个参数是内存块的大小 */ int JStringToChar(JNIEnv *env, jstring str, LPTSTR desc, int desc_len) { int len = 0; if(desc==NULLstr==NULL) return -1; //在VC中wchar_t是用来存储宽字节字符(UNICODE)的数据类型 wchar_t *w_buffer = new wchar_t[1024]; ZeroMemory(w_buffer,1024*sizeof(wchar_t)); //使用GetStringChars而不是GetStringUTFChars wcscpy(w_buffer,env-&GetStringChars(str,0)); env-&ReleaseStringChars(str,w_buffer); ZeroMemory(desc,desc_len); //调用字符编码转换函数(Win32 API)将UNICODE转为ASCII编码格式字符串 //关于函数WideCharToMultiByte的使用请参考MSDN len = WideCharToMultiByte(CP_ACP,0,w_buffer,1024,desc,desc_len,NULL,NULL); //len = wcslen(w_buffer); if(len&0 && len
  & 方法二,将C的字符串转为Java能识别的Unicode字符串
  jstring NewJString(JNIEnv* env,LPCTSTR str) { if(!env !str) return 0; int slen = strlen(str); jchar* buffer = new jchar[slen]; int len = MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,slen); if(len&0 && len & slen) buffer[len]=0; jstring js = env-&NewString(buffer,len); delete [] }
  由于调用了Java的方法,因此难免产生操作的异常信息。这些异常没有办法通过C++本身的异常处理机制来捕捉到,但JNI可以通过一些函数来 获取Java中抛出的异常信息。之前我们在Demo类中定义了一个方法throwExcp,下面将访问该方法并捕捉其抛出来的异常信息,代码如下:
  /** 假设我们已经构造了一个Demo的实例obj,其类定义为cls */ jthrowable excp = 0;/* 异常信息定义 */ jmethodID mid=(*env)-&GetMethodID(env,cls,&throwExcp&,&()V&); /*假如mid为0表示获取方法定义失败*/ jstring msg = (*env)-& CallVoidMethod(env, obj, mid); /* 在调用该方法后会有一个IllegalAccessException的异常抛出 */ excp = (*env)-&ExceptionOccurred(env); if(excp){ (*env)-&ExceptionClear(env); //通过访问excp来获取具体异常信息 /* 在Java中,大部分的异常信息都是扩展类java.lang.Exception,因此可以访问excp的toString 或者getMessage来获取异常信息的内容。访问这两个方法同前面讲到的如何访问类的方法是相同的。 */ }
  线程和同步访问
  有些时候需要使用多线程的方式来访问Java的方法。我们知道一个Java虚拟机是非常消耗系统的内存资源,差不多每个虚拟机需要内存大约在 20MB左右。为了节省资源要求每个线程使用的是同一个虚拟机,这样在整个的JNI程序中只需要初始化一个虚拟机就可以了。所有人都是这样想的,但是一旦 子线程访问主线程创建的虚拟机环境变量,系统就会出现错误对话框,然后整个程序终止。
  其实这里面涉及到两个概念,它们分别是虚拟机(JavaVM *jvm)和虚拟机环境(JNIEnv *env)。真正消耗大量系统资源的是jvm而不是env,jvm是答应多个线程访问的,但是env只能被创建它本身的线程所访问,而且每个线程必须创建 自己的虚拟机环境env。这时候会有人提出疑问,主线程在初始化虚拟机的时候就创建了虚拟机环境env。为了让子线程能够创建自己的env,JNI提供了 两个函数:AttachCurrentThread和DetachCurrentThread。下面代码就是子线程访问Java方法的框架:
  DWord WINAPI ThreadProc(PVOID dwParam) { JavaVM jvm = (JavaVM*)dwP/* 将虚拟机通过参数传入 */ JNIEnv* (*jvm)-& AttachCurrentThread(jvm, (void**)&env, NULL); ......... (*jvm)-& DetachCurrentThread(jvm); }
  关于时间的话题是我在实际开发中碰到的一个问题。当要发布使用了JNI的程序时,并不一定要求客户要安装一个Java运行环境,因为可以在安装 程序中打包这个运行环境。为了让打包程序利于下载,这个包要比较小,因此要去除JRE(Java运行环境)中一些不必要的文件。但是假如程序中用到 Java中的日历类型,例如java.util.Calendar等,那么有个文件一定不能去掉,这个文件就是[JRE]lib zmappings。它是一个时区映射文件,一旦没有该文件就会发现时间操作上经常出现与正确时间相差几个小时的情况。下面是打包JRE中必不可少的文件 列表(以Windows环境为例),其中[JRE]为运行环境的目录,同时这些文件之间的相对路径不能变。
  文件名目录 hpi.dll [JRE]in ioser12.dll [JRE]in java.dll [JRE]in net.dll [JRE]in verify.dll [JRE]in zip.dll [JRE]in jvm.dll [JRE]inclassic rt.jar [JRE]lib tzmappings [JRE]lib
  由于rt.jar有差不多10MB,但是其中有很大一部分文件并不需要,可以根据实际的应用情况进行删除。例如程序假如没有用到Java Swing,就可以把涉及到Swing的文件都删除后重新打包。&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&
Powered by 阳光大学生网 (C)
沪ICP备号-1
Copyright@ 阳光大学生网 公司介绍 联系我们 合作投稿等联系方式 邮箱写好了一个java中实现对网络和本地图片进行读取修改并保存的程序 - 推酷
写好了一个java中实现对网络和本地图片进行读取修改并保存的程序
终于做出来了!这几天我是茶饭不思,就为了写这么个破东西,终于写出来了,虽然最终的功能并不能让我满意,但是实在是不想再去做任何的改进了。要休息一下。这个程序主要功能是实现对网络图片的读取显示,界面是swing做的,所以不是很好看,面板有背景图片。其中保存网页图片,并不能保存修改过后的图片,这是很大的缺陷,在以后的编程中我还会继续对这个程序进行完善,期待发布第二篇关于这个程序的文档。好了,码字不是我的强项,直接贴出源代码,有心的网友自己可以粘贴下来运行,我的IDE工具是myEclipse 9.0 M1版本 !源代码比较长,建议读者看的时候一定要把这个分成几部分来看,以相关连的类开始看,最好是画出这个程序的UML描述图看的话更是一目了然!
package xinyu.shangrao.demo.
import java.awt.*;
import java.awt.datatransfer.C
import java.awt.datatransfer.DataF
import java.awt.datatransfer.T
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.InputE
import java.awt.event.MouseE
import java.awt.event.MouseL
import java.awt.image.FilteredImageS
import java.awt.image.RGBImageF
import java.io.ByteArrayOutputS
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import java.io.InputS
import java.net.HttpURLC
import java.net.MalformedURLE
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.MenuE
public class TestDemo extends JFrame implements ActionListener
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& , MouseListener{&& &
&& & * @author Rick
&& & * 这个文件的图片是获取自网络上,通过URL链接生成的图片,
&& & * 当没有网络是,程序便会产生一个NullPointerException异常
&& & * ,因为没有网络,url链接返回一个null,而不是产生一个
&& & * MalformedURLException!
&& &private static final long serialVersionUID = 1L;
&& &private BeiJingPane pane& ;
&& &private JPanel panButton= new JPanel();& //放置按钮
&& &private JButton bt = new JButton(&载入本地图片&);
&& &private JButton bt0= new JButton(&载入网络图片&);
&& &private JButton bt1= new JButton(&放大&);& &
&& &private JButton bt2= new JButton(&缩小&);& &
&& &private JButton bt3 =new JButton(&透明度&);
&& &private JButton bt4 =new JButton(&调色板&);
&& &private String name= new String();
&& &private JLabel label = new JLabel();
&& &private JMenuBar menuBar = new JMenuBar();
&& &private JMenu menuOpen= new JMenu(&保存网络图片&);
&& &private JMenu menuNative=new JMenu(&本地图片&);
&& &private JMenu menuNet =new JMenu(&网络图片&);
&& &private JMenu menuQuit=new JMenu(&退出&);
&& &//private ImageIcon& iic1= new ImageIcon();
&& &private Color color&&&& ;
&& &private Container cot= new Container();
&&& private Demo nativeD
&&& private Demo netD
&&& private String pathD& //存放文件路径
&& &private int currentWidth,currentH
&& &private& final& int step=50; &
&& &private FilteredImageSource fileI
&& &private I
&& &private Image currentI
&& &private short currentTmp=255;
&&& private boolean isBigOn=
&&& private boolean isClear=
&&& private boolean isChange=
&&& private ImageIcon iic1=new ImageIcon();
&&& private int colorRgb=0;
&&& private int counts=0;
&&& private File nativeFileN
&&& private URL netUrlN
&&& private String nativeI
&&& private String netI
&&& public TestDemo(String name){
&& &&& &this.name=
&& &&& &this.setName(this.name);
&& &&& &cot=this.getContentPane();& &&& &&&& &
&& &&& &setSize(700,500);
&& &&& &pane =new BeiJingPane(this.getWidth(),this.getHeight());
&& &&& &pane.setLayout(new BorderLayout());
&& &&& &cot.add(pane);
&& &&& &panButton.add(bt);
&& &&& &panButton.add(bt0);
&& &&& &panButton.add(bt1);
&& &&& &panButton.add(bt2);
&& &&& &panButton.add(bt3);
&& &&& &panButton.add(bt4);
&& &&& &menuBar.add(menuOpen);
&& &&& &menuBar.add(menuNative);
&& &&& &menuBar.add(menuNet);
&& &&& &menuBar.add(menuQuit);
&& &&& &pane.add(panButton,BorderLayout.SOUTH);
&&&&&&& pane.add(menuBar,BorderLayout.NORTH);
&& &&& &//iic1=this.paintok(getGraphics());
&& &&& &pane.add(label,BorderLayout.CENTER);
&& &&& &pane.paintComponents(getGraphics());
&& &&& &label.setSize(100, 150);
&& &&& &bt0.addActionListener(this);
&& &&& &bt.addActionListener(this);
&& &&& &bt1.addActionListener(this);
&& &&& &bt2.addActionListener(this);
&& &&& &bt3.addActionListener(this);
&& &&& &bt4.addActionListener(this);
&& &&& &menuOpen.addMouseListener(this);& &&& &
&& &&& &menuNative.addMouseListener(this);
&& &&& &menuNet.addMouseListener(this);
&& &&& &menuQuit.addMouseListener(this);
&& &&& &this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
&& &&& &setVisible(true);&& &
&& &public void menuSelected(MenuEvent arg0){
&&& public void setTupian(){
&& &&& &FileDialog abc=
&& &&& &&& &new FileDialog(new Frame(),&test&,FileDialog.SAVE)& ;
&& &&& &abc.setVisible(true);
&& &&& &if(abc.getFile() != null){
&& &&& &&& pathDir=abc.getDirectory();
&& &&& &&& pathDir=pathDir.replace('\\', '/'); && &
&& &&& &&& try{
&& &&& &&&&& new TSUN(abc.getFile(),pathDir,netImage);//一定要先载入网络图片再保存图片
&& &&& &&& }catch(Exception e){
&& &&& &&& &&& new ErrorFrame();
&& &&& &&& }
&&& public void actionPerformed(ActionEvent e){
&& &&& &if(e.getSource()==bt ){&& &&& &
&& &&& &&& &if(nativeDemo.getFilename() != null)nativeImage=nativeDemo.getFilename();
&& &&& &&& &iic1=this.paintNative(getGraphics());& &&& &&& &&& &&& &&& &
&& &&& &&& &label.setIcon(iic1);counts=1;
&& &&& &else if(e.getSource() == bt0){& &&& &&& &
& &&& &&& &&&&& if(netDemo.getUrl() != null)netImage=netDemo.getUrl();
& &&& &&& &&&&& iic1=this.paintNet(getGraphics());
& &&& &&& &&&&& label.setIcon(iic1);counts=2;
&& &&& &else if(e.getSource()==bt1){//点击多次会无效果
&& &&& &&& &currentWidth +=
&& &&& &&& &currentHeight +=&& &&& &
&& &&& &&& &isBigOn =
&& &&& &&& &if(counts==1)label.setIcon(this.paintNative(getGraphics()));
&& &&& &&& &else if(counts==2)label.setIcon(this.paintNet(getGraphics()));
&& &&& &&& &else
&& &&& &&& &&& &label.setIcon(this.paintok(getGraphics()));
&& &&& &else if(e.getSource()==bt2){//点击多次会无效果
&& &&& &&& &currentWidth -=
&& &&& &&& &currentHeight -=&& &&& &
&& &&& &&& &isBigOn =
&& &&& &&& &if(counts==1)label.setIcon(this.paintNative(getGraphics()));
&& &&& &&& &else if(counts==2)label.setIcon(this.paintNet(getGraphics()));
&& &&& &&& &else
&& &&& &&& & label.setIcon(this.paintok(getGraphics()));
&& &&& &else if(e.getSource()==bt3){
&& &&& &&& &currentTmp -=
&& &&& &&& &isClear=
&& &&& &&& &if(counts==1)label.setIcon(this.paintNative(getGraphics()));
&& &&& &&& &else if(counts==2)label.setIcon(this.paintNet(getGraphics()));
&& &&& &&& &else
&& &&& &&& & label.setIcon(this.paintok(getGraphics()));
&& &&& &else if(e.getSource()==bt4){
&& &&& &&& &isChange=
&& &&& &&& &color=JColorChooser.showDialog(getParent(), &调色板&, getBackground());
&& &&& &&& &if(color != null )
&& &&& &&& &colorRgb=color.getRGB();
&& &&& &&& &if(counts==1)label.setIcon(this.paintNative(getGraphics()));
&& &&& &&& &else if(counts==2)label.setIcon(this.paintNet(getGraphics()));
&& &&& &&& &else
&& &&& &&& & label.setIcon(this.paintok(getGraphics()));&& &&& &&& &
&&& public ImageIcon& paintok(Graphics g){
&& &&& &ImageI
&& &&& && try {
&& &&& &&& &img = ImageIO.read(new URL(&http://a4.att.hudong.& +
&& &&& &&& &&& &&& &&com/74/38/051207& +
&& &&& &&& &&&&&&&& &.jpg&));
&& &&& && } catch (MalformedURLException e) {&& &&& &
&& &&& &&& &e.printStackTrace();
&& &&& && } catch (IOException e) {&& &&& &
&& &&& &&& &e.printStackTrace();
&& &&& &}&& &&& &
&& &&& &if(!isClear){
&& &&& &&& &fileImage = new FilteredImageSource(img.getSource(),new FilterRGB());
&& &&& &&& &currentImg = Toolkit.getDefaultToolkit().createImage(fileImage);
&& &&& &if( isClear){
&& &&& &&& &
&& &&& &&& &fileImage = new FilteredImageSource(img.getSource(),new ClearRGB(currentTmp));
&& &&& &&& &currentImg = Toolkit.getDefaultToolkit().createImage(fileImage);
&& &&& &//&& &isClear=
&& &&& &if(isChange){
&& &&& &&& &fileImage = new FilteredImageSource(img.getSource(),new ChangeRGB(colorRgb));
&& &&& &&& &currentImg = Toolkit.getDefaultToolkit().createImage(fileImage);
&& &&& &&& &isChange=
&& &&& &if(!isBigOn){
&& &&& &&& &currentHeight = currentImg.getHeight(null);
&& &&& &&&& currentWidth = currentImg.getWidth(null);
&& &&& &if(isBigOn){
&& &&& &&& &currentImg=currentImg.getScaledInstance
&& &&& &&&&&&& ( currentWidth ,currentHeight ,Image.SCALE_DEFAULT);& &
&& &&& &iic =new ImageIcon(currentImg);
&&& public ImageIcon& paintNative(Graphics g){
&& &&& &ImageI
&& &&& & nativeFileName=new File(nativeImage);
&& &&& && try {
&& &&& &&& &img = ImageIO.read(nativeFileName);
&& &&& && } catch (MalformedURLException e) {&& &&& &
&& &&& &&& &e.printStackTrace();
&& &&& && } catch (IOException e) {&& &&& &
&& &&& &&& &new ErrorFrame();
&& &&& && }
&& &&& &if(!isClear){
&& &&& &&& &fileImage = new FilteredImageSource(img.getSource(),new FilterRGB());
&& &&& &&& &currentImg = Toolkit.getDefaultToolkit().createImage(fileImage);
&& &&& &if( isClear){
&& &&& &&& &
&& &&& &&& &fileImage = new FilteredImageSource(img.getSource(),new ClearRGB(currentTmp));
&& &&& &&& &currentImg = Toolkit.getDefaultToolkit().createImage(fileImage);
&& &&& &//&& &isClear=
&& &&& &if(isChange){
&& &&& &&& &fileImage = new FilteredImageSource(img.getSource(),new ChangeRGB(colorRgb));
&& &&& &&& &currentImg = Toolkit.getDefaultToolkit().createImage(fileImage);
&& &&& &&& &isChange=
&& &&& &if(!isBigOn){
&& &&& &&& &currentHeight = currentImg.getHeight(null);
&& &&& &&&& currentWidth = currentImg.getWidth(null);
&& &&& &if(isBigOn){
&& &&& &&& &currentImg=currentImg.getScaledInstance
&& &&& &&&&&&& ( currentWidth ,currentHeight ,Image.SCALE_DEFAULT);& &
&& &&& &iic =new ImageIcon(currentImg);
&&& public ImageIcon& paintNet(Graphics g){
&& &&& &ImageI
&& &&& & try {
&& &&& &&& &netUrlName = new URL(netImage);
&& &&& &} catch (MalformedURLException e1) {
&& &&& &&& && new ErrorFrame();
&& &&& &&& &e1.printStackTrace();
&& &&& && try {
&& &&& &&& &img = ImageIO.read(netUrlName);
&& &&& && } catch (MalformedURLException e) {&& &&& &
&& &&& &&& &e.printStackTrace();
&& &&& && } catch (IOException e) {&& &&& &
&& &&& &&& &e.printStackTrace();new Frame(&&);
&& &&& && }
&& &&& &if(!isClear){
&& &&& &&& &fileImage = new FilteredImageSource(img.getSource(),new FilterRGB());
&& &&& &&& &currentImg = Toolkit.getDefaultToolkit().createImage(fileImage);
&& &&& &if( isClear){
&& &&& &&& &
&& &&& &&& &fileImage = new FilteredImageSource(img.getSource(),new ClearRGB(currentTmp));
&& &&& &&& &currentImg = Toolkit.getDefaultToolkit().createImage(fileImage);
&& &&& &//&& &isClear=
&& &&& &if(isChange){
&& &&& &&& &fileImage = new FilteredImageSource(img.getSource(),new ChangeRGB(colorRgb));
&& &&& &&& &currentImg = Toolkit.getDefaultToolkit().createImage(fileImage);
&& &&& &&& &isChange=
&& &&& &if(!isBigOn){
&& &&& &&& &currentHeight = currentImg.getHeight(null);
&& &&& &&&& currentWidth = currentImg.getWidth(null);
&& &&& &if(isBigOn){
&& &&& &&& &currentImg=currentImg.getScaledInstance
&& &&& &&&&&&& ( currentWidth ,currentHeight ,Image.SCALE_DEFAULT);& &
&& &&& &iic =new ImageIcon(currentImg);
&& &public static void main(String[] args) {
&& &&& & new TestDemo(&demo&);&& &&&&&&&&&&&& &
&& &@Override
&& &public void mouseClicked(MouseEvent arg0) {
&& &&& &if(arg0.getSource()==menuOpen){&& &&& && &
&& &&& &&& &this.setTupian();
&& &&& &else if(arg0.getSource()==menuNet){
&& &&& &&&&&& netDemo =new Demo(&这里输入链接&);
&& &&& &&& & && &&& &
&& &&& &else if(arg0.getSource()==menuNative){&& &&& &&& &
&& &&& &&& &nativeDemo =new Demo(&这里输入本地图片路径&);&& &&& & && &&& && &
&& &&& &&& &
&& &&& && &
&& &&& &else if(arg0.getSource()==menuQuit){
&& &&& &&& & switch(JOptionPane.showConfirmDialog(null, &quit?&))
&& &&& &&& && {
&& &&& &&& &&&&&& case JOptionPane.YES_OPTION:
&& &&& &&& &&&&&&&&&&&& System.exit(0); &
&& &&& &&& &&&&& &
&& &&& &&& && }
&& &&& &&& & &
&& &@Override
&& &public void mouseEntered(MouseEvent arg0) {&& &&& & && &&& &
&& &@Override
&& &public void mouseExited(MouseEvent arg0) {&& & && &&& &
&& &@Override
&& &public void mousePressed(MouseEvent arg0) {&& & && &&& &
&& &@Override
&& &public void mouseReleased(MouseEvent e) {&& &&& &
/*从网络获取图片并存储在本地*/ &
class TSUN { &
&&&& * @param args
&&&& * @throws Exception
&& &private S
&& &private S
&& &private String netN
&& &private String urlN
&& &public TSUN(String filename,String pathname,String netName) throws Exception{
&& &&& &this.netName=netN
&& &&& &this.filename=
&& &&& &this.pathname=
&& &&& &if(filename!=null && pathname != null)
&& &&& &&& huizhi();
&&& public&& void& huizhi() throws Exception { &
&&&&&&&& urlName=&//.jpg&;//默认地址
&&&&&& // URL url = new URL(&//.jpg&);
&& &&& & if(netName != null) urlName= netN&& &
&&&&&&&& URL& url=new URL(urlName);
&&&&&&& //打开链接 &
&&&&&&& HttpURLConnection conn = (HttpURLConnection)url.openConnection(); &
&&&&&&& //设置请求方式为&GET& &
&&&&&&& conn.setRequestMethod(&GET&); &
&&&&&&& //超时响应时间为5秒 &
&&&&&&& conn.setConnectTimeout(5 * 1000); &
&&&&&&& //通过输入流获取图片数据 &
&&&&&&& InputStream inStream = conn.getInputStream();
&&&&&&& //得到图片的二进制数据,以二进制封装得到数据,具有通用性 &
&&&&&&& byte[] data = readInputStream(inStream);&&&&&& &
&&&&&&& //new一个文件对象用来保存图片,默认保存当前工程根目录 &
&&&&&&& File imageFile = new File(pathname+filename); &
&&&&&&& //创建输出流 &
&&&&&&& FileOutputStream outStream = new FileOutputStream(imageFile); &
&&&&&&& //写入数据 &
&&&&&&& outStream.write(data); &
&&&&&&& //关闭输出流 &
&&&&&&& outStream.close(); &
&&& public static byte[] readInputStream(InputStream inStream) throws Exception{ &
&&&&&&& ByteArrayOutputStream outStream = new ByteArrayOutputStream(); &
&&&&&&& //创建一个Buffer字符串 &
&&&&&&& byte[] buffer = new byte[1024]; &
&&&&&&& //每次读取的字符串长度,如果为-1,代表全部读取完毕 &
&&&&&&& int len = 0;& //初始化的值,所以值并不是很重要
&&&&&&& //使用一个输入流从buffer里把数据读取出来 , 每次都检测是否读到流末尾并返回实际读取字节数
&&&&&&& while( (len=inStream.read(buffer)) != -1 ){& &
&&&&&&&&&&& //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 &
&&&&&&&&&&& outStream.write(buffer, 0, len); &
&&&&&&& } &
&&&&&&& outStream.write(buffer); &
&&&&&&& //关闭输入流 &
&&&&&&& inStream.close(); &
&&&&&&& //把outStream里的数据写入内存 &
&&&&&&& return outStream.toByteArray(); &
/*交换红蓝两种像素*/
class FilterRGB extends RGBImageFilter{
&& &public& int filterRGB(int x,int y,int rgb){
&& &&& &return& ((rgb & 0xFF00FF00)|((rgb & 0xff0000)&&16)|((rgb & 0xff)&&16));
/*使相片透明*/
class ClearRGB extends RGBImageFilter{
&& &public ClearRGB(short s){
&& &&& &tmp -=
&& &@Override
&& &public int filterRGB(int x, int y, int rgb) {&& &&& &
&& &&& &return& (rgb&(0xffffff+(tmp&&24)));
/*使相片随着调色板而改变*/
class ChangeRGB extends RGBImageFilter{
&& &public ChangeRGB(int s){
&& &&& &tmp -=
&& &@Override
&& &public int filterRGB(int x, int y, int rgb) {&& &&& &
&& &&& &return& (rgb|tmp);
class BeiJingPane extends JPanel{&& &
&& &private ImageIcon beiJing = new ImageIcon( );
&& &private I
&& &private static final long serialVersionUID = 1L;
&& &public BeiJingPane(int width,int height){
&& &&& &try {
&& &&& &&& &img=ImageIO.read(
&& &&& &&& &&& &&& &new File(&D:\\My Documents\\My Pictures\\SB.gif& ));//不能显示动态,只是静态的
&& &&& &&& &img=img.getScaledInstance(width, height, Image.SCALE_DEFAULT);
&& &&& &&& &beiJing= new ImageIcon(img );
&& &&& &&& &
&& &&& &} catch (IOException e) {&& &&& &
&& &&& &&& &e.printStackTrace();
&& &@Override
&& &public void paintComponent(Graphics g){
&& &&& &super.paintComponent(g);
&& &&& &Image img =beiJing.getImage();
&& &&& &g.drawImage(img, 0, 0, getParent());
class JoinmePane extends JPanel{&& &
&& &private ImageIcon beiJing = new ImageIcon( );
&& &private I
&& &private static final long serialVersionUID = 1L;
&& &public& JoinmePane(int width,int height){
&& &&& &try {
&& &&& &&& &img=ImageIO.read(
&& &&& &&& &&& &&& &new File(&D:\\My Documents\\My Pictures\\SB.gif& ));//不能显示动态,只是静态的
&& &&& &&& &img=img.getScaledInstance(width, height, Image.SCALE_DEFAULT);
&& &&& &&& &beiJing= new ImageIcon(img );
&& &&& &&& &
&& &&& &} catch (IOException e) {&& &&& &
&& &&& &&& &e.printStackTrace();
&& &@Override
&& &public void paintComponent(Graphics g){
&& &&& &super.paintComponent(g);
&& &&& &Image img =beiJing.getImage();
&& &&& &g.drawImage(img, 0, 0, getParent());
class& Demo extends JFrame implements ActionListener
&&&&&&&&&&&&&&&&&&&&&&&&&&& ,MouseListener{
&& &private static final long serialVersionUID = -169266L;
&& &private JPanel pane=new JPanel();
&& &private S
&& &private ZJTextField tf = new ZJTextField();
&& &private JButton bt= new JButton(&确认&);
&&& private S
&&& private S
&&& private boolean status= //反应按键是否按下的状态值
&&& public Demo(String inf){
&& &&& &setSize(200,300);
&&&&&&& this.inf=
&& &&& &pane.add(tf);
&&&&&&& tf.setText(this.inf);
&& &&& &pane.add(bt);
&& &&& &pane.setBackground(Color.blue);
&& &&& &bt.addActionListener(this);
&& &&& &tf.addMouseListener(this);
&& &&& &this.add(pane);
&& &&& &this.setDefaultCloseOperation(EXIT_ON_CLOSE);
&& &&& &this.setVisible(true);
&& &@Override&& &
&& &public void actionPerformed(ActionEvent e) {
&& &&& if(e.getSource()==bt){
&& &&& &&& url=tf.getText();
&& &&& &&& filename=tf.getText();
&& &&& &&& status=
&& &&& &&& this.dispose();& //关闭窗口
&& &&& & &
&& &public boolean getStatus(){
&& &@Override
&& &public void mouseClicked(MouseEvent e) {
&& &&& &if(e.getSource()==tf){
&& &&& &&& &tf.setText(&&);
&& &&& &&& &
&& &public String getUrl(){
&& &public String getFilename(){
&& &@Override
&& &public void mouseEntered(MouseEvent arg0) {&& & && &&& &
&& &@Override
&& &public void mouseExited(MouseEvent arg0) {&& &
&& &@Override
&& &public void mousePressed(MouseEvent arg0){&& &
&& &@Override
&& &public void mouseReleased(MouseEvent arg0) {&& & && &&& &
class ErrorFrame extends JFrame{
&& &private static final long serialVersionUID = 1L;
&& &private JPanel& panel=new JPanel();
&& &private JLabel& label=new JLabel(&你输入了错误的信息&);
&& &public ErrorFrame(){
&& &&& &panel.setLayout(new BorderLayout());
&& &&& &panel.add(label);
&& &&& &panel.setBackground(Color.blue);
&& &&& &this.setLocationRelativeTo(null);
&& &&& &add(panel);
&& &&& &this.setVisible(true);
/*share your idea with the people all round the world
&* is happy for you and me*/
//实现JTextfield 的复制、剪切、粘贴功能。 &
class ZJTextField extends JTextField implements MouseListener { &
&&& private static final long serialVersionUID = -5560110L; &
&&& private JPopupMenu pop = // 弹出菜单 &
&&& private JMenuItem copy = null, paste = null, cut = // 三个功能菜单 &
&&& public ZJTextField() { &
&&&&&&& super(); &
&&&&&&& init(); &
&&& private void init() { &
&&&&&&& this.addMouseListener(this); &
&&&&&&& pop = new JPopupMenu(); &
&&&&&&& pop.add(copy = new JMenuItem(&复制&)); &
&&&&&&& pop.add(paste = new JMenuItem(&粘贴&)); &
&&&&&&& pop.add(cut = new JMenuItem(&剪切&)); &
&&&&&&& copy.setAccelerator(KeyStroke.getKeyStroke('C', InputEvent.CTRL_MASK)); &
&&&&&&& paste.setAccelerator(KeyStroke.getKeyStroke('V', InputEvent.CTRL_MASK)); &
&&&&&&& cut.setAccelerator(KeyStroke.getKeyStroke('X', InputEvent.CTRL_MASK)); &
&&&&&&& copy.addActionListener(new ActionListener() { &
&&&&&&&&&&& public void actionPerformed(ActionEvent e) { &
&&&&&&&&&&&&&&& action(e); &
&&&&&&&&&&& } &
&&&&&&& }); &
&&&&&&& paste.addActionListener(new ActionListener() { &
&&&&&&&&&&& public void actionPerformed(ActionEvent e) { &
&&&&&&&&&&&&&&& action(e); &
&&&&&&&&&&& } &
&&&&&&& }); &
&&&&&&& cut.addActionListener(new ActionListener() { &
&&&&&&&&&&& public void actionPerformed(ActionEvent e) { &
&&&&&&&&&&&&&&& action(e); &
&&&&&&&&&&& } &
&&&&&&& }); &
&&&&&&& this.add(pop); &
&&&& * 菜单动作
&&&& * @param e
&&& public void action(ActionEvent e) { &
&&&&&&& String str = e.getActionCommand(); &
&&&&&&& if (str.equals(copy.getText())) { // 复制 &
&&&&&&&&&&& this.copy(); &
&&&&&&& } else if (str.equals(paste.getText())) { // 粘贴 &
&&&&&&&&&&& this.paste(); &
&&&&&&& } else if (str.equals(cut.getText())) { // 剪切 &
&&&&&&&&&&& this.cut(); &
&&&&&&& } &
&&& public JPopupMenu getPop() { &
&&& public void setPop(JPopupMenu pop) { &
&&&&&&& this.pop = &
&&&& * 剪切板中是否有文本数据可供粘贴
&&&& * @return true为有文本数据
&&& public boolean isClipboardString() { &
&&&&&&& boolean b = &
&&&&&&& Clipboard clipboard = this.getToolkit().getSystemClipboard(); &
&&&&&&& Transferable content = clipboard.getContents(this); &
&&&&&&& try { &
&&&&&&&&&&& if (content.getTransferData(DataFlavor.stringFlavor) instanceof String) { &
&&&&&&&&&&&&&&& b = &
&&&&&&&&&&& } &
&&&&&&& } catch (Exception e) { &
&&&&&&& } &
&&&& * 文本组件中是否具备复制的条件
&&&& * @return true为具备
&&& public boolean isCanCopy() { &
&&&&&&& boolean b = &
&&&&&&& int start = this.getSelectionStart(); &
&&&&&&& int end = this.getSelectionEnd(); &
&&&&&&& if (start != end) &
&&&&&&&&&&& b = &
&&& public void mouseClicked(MouseEvent e) { &
&&& public void mouseEntered(MouseEvent e) { &
&&& public void mouseExited(MouseEvent e) { &
&&& public void mousePressed(MouseEvent e) { &
&&&&&&& if (e.getButton() == MouseEvent.BUTTON3) { &
&&&&&&&&&&& copy.setEnabled(isCanCopy()); &
&&&&&&&&&&& paste.setEnabled(isClipboardString()); &
&&&&&&&&&&& cut.setEnabled(isCanCopy()); &
&&&&&&&&&&& pop.show(this, e.getX(), e.getY()); &
&&&&&&& } &
&&& public void mouseReleased(MouseEvent e) { &
以下是运行效果图:
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 微信朋友删除怎么找回 的文章

 

随机推荐