精华内容
下载资源
问答
  • 当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能。与等待/通知相关的方法是Java中所有对象都具备的方法,它们被定义在java....

    当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能。

    与等待/通知相关的方法是Java中所有对象都具备的方法,它们被定义在java.lang.Object中。

    notify()方法:通知一个在对象上等待的线程,使其从wait()方法中返回,并且返回的前提是该线程获取到了对象的锁。

    notifyAll()方法:与notify()不同的是,会通知所有等待在该对象上的线程。

    wait()方法:调用该方法的线程会在对象上等待,进入WAITING状态,只有等待另外的线程通知或者被中断才会返回。调用wait()方法后,会释放对象的锁。

    wait(long timeout):超时等待一段时间,如果等待指定时间后还没有收到通知就会超时返回,参数单位为毫秒。

    wait(long timeout, int nanos):超时等待更加精确的实现方法,可精确到纳秒。

    当线程A调用的对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A将会收到通知从O的wait()返回,继续执行后续操作。

    等待/通知的经典实现方式:

    等待方(消费者):

    synchronized(obj){

    while(判断条件不满足){

    obj.wait();

    }

    其它处理逻辑

    }

    通知方(生产者):

    synchronized(obj){

    改变条件

    obj.notifyAll();

    }

    使用等待/超时机制实现一个简单的对象池,模拟多个线程不断地从对象池中取出资源,使用完后归还资源到对象池中,使得其它线程可以继续使用这些资源。

    定义资源类:

    public class Resource {

    private String name;

    public Resource(String name) {

    this.name = name;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    }

    定义对象池:

    public class ResourcePool {

    // 使用双向列表保存所有的资源

    private LinkedList pool = new LinkedList();

    public ResourcePool(int poolSize) {

    // 初始化pool,将可用的对象放入pool中

    for (int i = 0; i 

    pool.add(new Resource("RES_" + i));

    }

    }

    // 获取资源

    public Resource getResource(long timeout) {

    long future = System.currentTimeMillis() + timeout;

    long waitRemain = timeout;

    synchronized (pool) {

    // 判断有没有资源,若没有则等待

    while (pool.isEmpty()) {

    try {

    // 在pool对象上等待,此时会释放pool对象的锁

    pool.wait(waitRemain);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    waitRemain = future - System.currentTimeMillis();

    if (waitRemain <= 0) {

    // 若等待超时,则返回null

    System.out.println(Thread.currentThread().getName() + " get resource time out");

    return null;

    }

    }

    // 将资源从pool中移除,并返回资源

    Resource resource = pool.removeFirst();

    System.out.println(Thread.currentThread().getName() + " get resource: " + resource.getName());

    return resource;

    }

    }

    // 释放资源

    public void releaseResource(Resource resource) {

    if (resource != null) {

    synchronized (pool) {

    // 归还资源

    pool.addLast(resource);

    System.out.println(Thread.currentThread().getName() + " released resource: " + resource.getName());

    // 通知所有等待在pool对象上的线程

    pool.notifyAll();

    }

    }

    }

    }

    main方法:

    public static void main(String[] args) {

    // 多个线程从资源池中同步获取资源

    final ResourcePool resPool = new ResourcePool(5);

    // 使用闭锁,让所有线程同时开始执行

    final CountDownLatch startGate = new CountDownLatch(1);

    for (int i = 0; i 

    Thread thread = new Thread(new Runnable() {

    public void run() {

    try {

    // 等待闭锁的计数器为0时,才能继续向下执行

    startGate.await();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    // 获取资源,5秒超时

    Resource resource = resPool.getResource(5000);

    if (resource != null) {

    try {

    // 随机等待(1~10秒)若干秒后,再释放资源

    Random random = new Random();

    Thread.sleep((random.nextInt(9) + 1) * 1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    resPool.releaseResource(resource);

    }

    }

    });

    thread.setName("Th_" + i);

    thread.start();

    }

    // 闭锁的计数减1,此时值为0,所有线程开始继续执行

    startGate.countDown();

    }

    控制台输出:

    Th_9 get resource: RES_0

    Th_7 get resource: RES_1

    Th_8 get resource: RES_2

    Th_6 get resource: RES_3

    Th_3 get resource: RES_4

    Th_6 released resource: RES_3

    Th_0 get resource: RES_3

    Th_7 released resource: RES_1

    Th_4 get resource: RES_1

    Th_8 released resource: RES_2

    Th_2 get resource: RES_2

    Th_1 get resource time out

    Th_5 get resource time out

    Th_0 released resource: RES_3

    Th_4 released resource: RES_1

    Th_9 released resource: RES_0

    Th_2 released resource: RES_2

    Th_3 released resource: RES_4

    展开全文
  • Java实现类MSN、QQ好友上线通知界面

    千次阅读 2008-12-10 14:47:00
    相信大家都使用过MSN,QQ这样的...笔者现用JAVA和eclipse的SWT用户界面组件实现这个功能。 什么是SWT呢? SWT原来是eclipse项目组为开发eclipse IDE所编写的图形界面API,运行时,其先判断本机是否有相同的界面元素
    相信大家都使用过MSN,QQ这样的即时聊天类软件,对于它们的好友上线提示功能并不陌生吧?从屏幕右下角弹出一个小界面,慢慢上升,最后消失。我们能不能在自已的程序中也做出相同的功能呢?能!笔者现用JAVA和eclipse的SWT用户界面组件实现这个功能。 

      什么是SWT呢?

      SWT原来是eclipse项目组为开发eclipse IDE所编写的图形界面API,运行时,其先判断本机是否有相同的界面元素,如果有则直接调用显示,如没有才进行模拟显示。其运行机制使速度比AWT,SWING快很多。

      了解更多请看:http://www.eclipse.org/swt

      编写思路

      先取得用户屏幕大小,用屏幕高度减去popup界面的高度计算出popup界面在屏幕显示的最高位置(当界面移动到此位置时就停止移动)。

    Rectangle area = Display.getDefault().getClientArea();
    int upPosition = area.height - 100;

      用屏幕高度加上popup界面的高度就计算出popup界面的初始位置(初始化时不可见,然后慢慢上移到upPosition点后停止移动,再显示若干秒后消失)。

    int downPosition = area.height + 100;

      移动位置我们用线程实现,当初始化界面后,调用start()方法运行此线程,在线程中循环判断downPosition的大小是否小于upPosition,如果小于的话说明还未到停止的时候,设置popup界面的边框为downPosition,并暂停10毫秒,如果downPosition大于upPosition的,说明popup界面已移动到了最高位置。调用sleep()暂停5秒钟后关闭界面并退出程序。就这么简单,ok, Let's go! 下面给出整个程序代码:

      描述:

      (Test为主界面,点击上面的button后,调用Popup在右下角显示像MSN和QQ一样的popup界面。)

      图一为源代码中的实现,图二为修改过后的界面(和QQ的有点像吧。)

    Java实现类MSN、QQ好友上线通知界面Java实现类MSN、QQ好友上线通知界面
    图一             图二

      源代码:

    // Test.java
    //主界面,其中只有一个button,当点击时调用Popup在右下角显示像MSN和QQ一样的popup界面。

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;

    public class Test {

     public static void main(String[] args) {

      final Display display = new Display();
      Shell shell = new Shell();
      shell.setText("aaa");
      shell.setSize(250, 150);

      final Button button = new Button(shell, SWT.NONE);
      button.setBounds(50, 20, 100, 25);
      button.setText("button");
      //监听button的事件,当用户点击时调用Popup类显示popup界面。
      button.addSelectionListener(new SelectionAdapter() {
       public void widgetSelected(SelectionEvent e) {
        //实例化popup类,构造函数为popup界面中出现的提示信息。
        Popup popup = new Popup("您的好友xxx上线了。");
        popup.start();
       }
      });

      shell.open();

      while (!shell.isDisposed()) {
       if (!display.readAndDispatch()) {
        display.sleep();
       }
      }
      display.dispose();
     }
    }

    // Popup.java
    //实现像MSN,QQ一样的好友上线通知popup

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;

    public class Popup extends Thread {

     Shell shell;

     protected int moveStep = 2; //每次移动的pixel
     protected int upPosition; //能移动到的最上面坐标
     protected int downPosition; //当前popup的边框坐标
     protected int leftPosition; //popup左边边框坐标 public Popup(final String message) {

     shell = new Shell(SWT.ON_TOP);
     Text text = new Text(shell, SWT.MULTI | SWT.WRAP);
     text.setBounds(10, 20, 180, 80);
     text.setBackground(shell.getBackground());
     text.setText(message);

     //取屏莫大小
     Rectangle area = Display.getDefault().getClientArea();

     upPosition = area.height - 100;//计算出popup界面在屏幕显示的最高位置
     downPosition = area.height + 100;//计算出popup界面的初始位置
     leftPosition = area.width - 180;

     shell.setSize(180, 100);

     //初始化popup位置
     shell.setLocation(leftPosition, downPosition);

     shell.open();

    }

    public void run() {

     Display display = shell.getDisplay();
     while (true) {
      try {
       Thread.sleep(10);

       //判断当前位置是否小于能出现的最高位置,小于的话就说明还可以向上移动。
       if ((downPosition - moveStep) > upPosition) {
        display.asyncExec(new Runnable() {
         public void run() {
          shell.setLocation(leftPosition, downPosition- moveStep);
          downPosition -= moveStep;
         }
        });
        //此时已经移动到了最高位置,显示5秒钟后,关闭窗口并退出。
       } else {
        Thread.sleep(5000);
        display.asyncExec(new Runnable() {
         public void run() {
          shell.dispose();
         }
        });
       }
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
     }
    }
    }

      上面的源程序就完成了图一中的功能,读者可以自行修改,让其界面,功能更强大。
    展开全文
  • 相信大家都使用过MSN,QQ这样的...笔者现用JAVA和eclipse的SWT用户界面组件实现这个功能。  什么是SWT呢?  SWT原来是eclipse项目组为开发eclipse IDE所编写的图形界面API,运行时,其先判断本机是否有相同的界面

     

     

      相信大家都使用过MSN,QQ这样的即时聊天类软件,对于它们的好友上线提示功能并不陌生吧?从屏幕右下角弹出一个小界面,慢慢上升,最后消失。我们能不能在自已的程序中也做出相同的功能呢?能!笔者现用JAVA和eclipse的SWT用户界面组件实现这个功能。

      什么是SWT呢?

      SWT原来是eclipse项目组为开发eclipse IDE所编写的图形界面API,运行时,其先判断本机是否有相同的界面元素,如果有则直接调用显示,如没有才进行模拟显示。其运行机制使速度比AWT,SWING快很多。

      了解更多请看:http://www.eclipse.org/swt

      编写思路

      先取得用户屏幕大小,用屏幕高度减去popup界面的高度计算出popup界面在屏幕显示的最高位置(当界面移动到此位置时就停止移动)。

    Rectangle area = Display.getDefault().getClientArea();
    int upPosition = area.height - 100;

      用屏幕高度加上popup界面的高度就计算出popup界面的初始位置(初始化时不可见,然后慢慢上移到upPosition点后停止移动,再显示若干秒后消失)。

    int downPosition = area.height + 100;

      移动位置我们用线程实现,当初始化界面后,调用start()方法运行此线程,在线程中循环判断downPosition的大小是否小于upPosition,如果小于的话说明还未到停止的时候,设置popup界面的边框为downPosition,并暂停10毫秒,如果downPosition大于upPosition的,说明popup界面已移动到了最高位置。调用sleep()暂停5秒钟后关闭界面并退出程序。就这么简单,ok, Let's go! 下面给出整个程序代码:

      描述:

      (Test为主界面,点击上面的button后,调用Popup在右下角显示像MSN和QQ一样的popup界面。)


      源代码:

    // Test.java
    //主界面,其中只有一个button,当点击时调用Popup在右下角显示像MSN和QQ一样的popup界面。

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;

    public class Test {

     public static void main(String[] args) {

      final Display display = new Display();
      Shell shell = new Shell();
      shell.setText("aaa");
      shell.setSize(250, 150);

      final Button button = new Button(shell, SWT.NONE);
      button.setBounds(50, 20, 100, 25);
      button.setText("button");
      //监听button的事件,当用户点击时调用Popup类显示popup界面。
      button.addSelectionListener(new SelectionAdapter() {
       public void widgetSelected(SelectionEvent e) {
        //实例化popup类,构造函数为popup界面中出现的提示信息。
        Popup popup = new Popup("您的好友xxx上线了。");
        popup.start();
       }
      });

      shell.open();

      while (!shell.isDisposed()) {
       if (!display.readAndDispatch()) {
        display.sleep();
       }
      }
      display.dispose();
     }
    }

    // Popup.java
    //实现像MSN,QQ一样的好友上线通知popup

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;

    public class Popup extends Thread {

     Shell shell;

     protected int moveStep = 2; //每次移动的pixel
     protected int upPosition; //能移动到的最上面坐标
     protected int downPosition; //当前popup的边框坐标
     protected int leftPosition; //popup左边边框坐标 public Popup(final String message) {

     shell = new Shell(SWT.ON_TOP);
     Text text = new Text(shell, SWT.MULTI | SWT.WRAP);
     text.setBounds(10, 20, 180, 80);
     text.setBackground(shell.getBackground());
     text.setText(message);

     //取屏莫大小
     Rectangle area = Display.getDefault().getClientArea();

     upPosition = area.height - 100;//计算出popup界面在屏幕显示的最高位置
     downPosition = area.height + 100;//计算出popup界面的初始位置
     leftPosition = area.width - 180;

     shell.setSize(180, 100);

     //初始化popup位置
     shell.setLocation(leftPosition, downPosition);

     shell.open();

    }

    public void run() {

     Display display = shell.getDisplay();
     while (true) {
      try {
       Thread.sleep(10);

       //判断当前位置是否小于能出现的最高位置,小于的话就说明还可以向上移动。
       if ((downPosition - moveStep) > upPosition) {
        display.asyncExec(new Runnable() {
         public void run() {
          shell.setLocation(leftPosition, downPosition- moveStep);
          downPosition -= moveStep;
         }
        });
        //此时已经移动到了最高位置,显示5秒钟后,关闭窗口并退出。
       } else {
        Thread.sleep(5000);
        display.asyncExec(new Runnable() {
         public void run() {
          shell.dispose();
         }
        });
       }
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
     }
    }
    }

      上面的源程序就完成要求功能,读者可以自行修改,让其界面,功能更强大。 

    展开全文
  • private int progress;// 当前进度private Thread downLoadThread; // 下载线程private ...// 用户取消下载// 通知处理刷新界面的handlerprivate Handler mHandler = new Handler() {@SuppressLint("HandlerLeak...

    private int progress;// 当前进度

    private Thread downLoadThread; // 下载线程

    private boolean interceptFlag = false;// 用户取消下载

    // 通知处理刷新界面的handler

    private Handler mHandler = new Handler() {

    @SuppressLint("HandlerLeak")

    @Override

    public void handleMessage(Message msg) {

    switch (msg.what) {

    case DOWN_UPDATE:

    mProgress.setProgress(progress);

    break;

    case DOWN_OVER:

    installApk();

    break;

    }

    super.handleMessage(msg);

    }

    };

    public UpdateManger(Context context) {

    this.mContext = context;

    }

    // 显示更新程序对话框,供主程序调用

    public void checkUpdateInfo() {

    showNoticeDialog();

    }

    private void showNoticeDialog() {

    android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(

    mContext);// Builder,可以通过此builder设置改变AleartDialog的默认的主题样式及属性相关信息

    builder.setTitle("软件版本更新");

    builder.setMessage(updateMsg);

    builder.setPositiveButton("下载", new OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    dialog.dismiss();// 当取消对话框后进行操作一定的代码?取消对话框

    showDownloadDialog();

    }

    });

    builder.setNegativeButton("以后再说", new OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    dialog.dismiss();

    }

    });

    noticeDialog = builder.create();

    noticeDialog.show();

    }

    protected void showDownloadDialog() {

    android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(mContext);

    builder.setTitle("软件版本更新");

    final LayoutInflater inflater = LayoutInflater.from(mContext);

    View v = inflater.inflate(R.layout.progress, null);

    mProgress = (ProgressBar) v.findViewById(R.id.progress);

    builder.setView(v);// 设置对话框的内容为一个View

    builder.setNegativeButton("取消", new OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    dialog.dismiss();

    interceptFlag = true;

    }

    });

    downloadDialog = builder.create();

    downloadDialog.show();

    downloadApk();

    }

    private void downloadApk() {

    downLoadThread = new Thread(mdownApkRunnable);

    downLoadThread.start();

    }

    protected void installApk() {

    File apkfile = new File(saveFileName);

    if (!apkfile.exists()) {

    return;

    }

    Intent i = new Intent(Intent.ACTION_VIEW);

    i.setDataAndType(Uri.parse("file://" + apkfile.toString()),

    "application/vnd.android.package-archive");// File.toString()会返回路径信息

    mContext.startActivity(i);

    }

    private Runnable mdownApkRunnable = new Runnable() {

    @Override

    public void run() {

    URL url;

    try {

    url = new URL(apkUrl);

    HttpURLConnection conn = (HttpURLConnection) url.openConnection();

    conn.connect();

    int length = conn.getContentLength();

    InputStream ins = conn.getInputStream();

    File file = new File(savePath);

    if (!file.exists()) {

    file.mkdir();

    }

    String apkFile = saveFileName;

    File ApkFile = new File(apkFile);

    FileOutputStream outStream = new FileOutputStream(ApkFile);

    int count = 0;

    byte buf[] = new byte[1024];

    do {

    int numread = ins.read(buf);

    count += numread;

    progress = (int) (((float) count / length) * 100);

    // 下载进度

    mHandler.sendEmptyMessage(DOWN_UPDATE);

    if (numread <= 0) {

    // 下载完成通知安装

    mHandler.sendEmptyMessage(DOWN_OVER);

    break;

    }

    outStream.write(buf, 0, numread);

    } while (!interceptFlag);// 点击取消停止下载

    outStream.close();

    ins.close();

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    };

    }

    展开全文
  • JAVA程序设计之基于TCP协议的socket聊天程序 ,供大家参考,具体内容如下一、程序实现功能1、进入客户端界面2、创建昵称3、群发信息4、@私聊5、下线通知6、在线人数统计二、整体架构图三、简单介绍本程序实现了...
  • SWT实现类MSN、QQ好友上线通知界面

    千次阅读 2007-12-25 22:15:00
    本文转载自Java天下社区:http://www.javatx.cn/index.jsp由ajie发表相信大家都使用过MSN,QQ这样的即时聊天类软件,对于它们的...笔者现用JAVA和eclipse的SWT用户界面组件实现这个功能。 什么是SWT呢? SWT原来是ecli
  • 今天实现一个具有闹钟功能的消息栏通知,即定时向消息栏推送通知,用户下拉通知栏列表,点击通知后,跳转到指定界面,效果图如下:   收到通知界面:       实现过程如下: (1)闹钟主界面: package ...
  • Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。 3. 2 系统实现原理 当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流...
  • 实现功能: 多客户端的同时连接 客户端上线通知 点击send按钮或者敲击回车进行发送 消息发送时间显示 客户端与服务器实时通信(可同时发送多条消息) ​ 将接受和发送放入两个线程实现 已知问题: ...
  • 2. 功能模块 3. 数据流图 4. ER图 5.代码截图 5.1 登录页面 5.2 管理员登录界面 5.3 管理员-实验室管理 5.4 管理员--设备借用管理 5.5 教师--主页面 5.6 教师--实验室预约 5.7 学生--主...
  • 实现界面 客户端 张飞用户 刘备用户 关羽用户: 聊天室的具体功能如下: 1: 群聊 2: 显示在线人数 3: 用户名信息 4: 用户离线, 通知其他在线的用户 聊天室代码的github:...
  • 界面由七个组件组成,两个标签,两个文本输入框,两个按钮,一个标签用来显示通知。 两个标签是用来显示“用户名”和“密码”; 两个文本输入框用来实现账户和密码的输入; 两个按钮分别具有登录和重置功能; 最后...
  • 5)通知功能:从服务器端获得排号,通过服务器端通知用户到工作台办理业务。 (2)客户端 1) 登录功能:业务员从此处登录,业务员的姓名,密码是事先录入数据库的。 2) 叫号功能:业务员点击处理按钮触发事件...
  • 需求功能实现客户端与服务器的连接 各个客户端能够共享消息界面,即一个客户端发送消息后所有在线客户端都能够收到 客户端登录时可以自定义昵称 客户端登录后显示已在线成员 客户端登录后通知其他在线成员,...
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
  • 利用Java实现C/S模式的大学班级内日常事务管理系统(PC版,应用于校内网有线网络访问,暂不开发移动端),使用swings技术完成如下基本功能需求: 班级公告通知 文稿匿名传阅投票 文件共享(上传、下载) 即时...
  • 软件工程的课程设计作业,主要功能包括查看成员信息、修改成员信息、增加成员、删除成员、成员部门调动、发布例会通知、设置界面皮肤、账号注册、修改密码、注销账号等
  • 2.实现上述界面上的各个按钮的功能 3.能够处理一些基本的异常事件,如除数不能为0 【实验原理】 MainFrame 类继承自JFrame,用于控制各组件的位置。Contrller用于处理JButton发送来的消息,并通知TLabel更新显示。...
  • JAVA聊天室

    2019-04-16 10:54:09
    使用java swing开发的聊天室,具有非常漂亮的界面,以及完善的功能。可以实现多用户聊天,通知功能
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
  • java源码包4

    千次下载 热门讨论 2013-04-20 11:31:44
     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
  • 用户登录 显示一个用于输入昵称的界面 聊天 群聊功能:在线用户一起聊天 发送悄悄话功能:与某个用户单独聊天 刷新用户列表 : 用于得到所有的用户列表 功能的具体实现 Client端: 显示用户登录界面 设置用户名不能...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 205
精华内容 82
关键字:

java界面通知功能实现

java 订阅