笔者这几天在写 基于 jmf 的 音乐播放器。

今天无意中想要加上,“窗口自动粘合”。在这里把所有问题全写出来。

在这里说明一下,我使用的是两个 窗体,MainView(主界面) PlayList(播放列表)。

先把用到的方法写出来:

得到窗体作标: .getBounds().x .getBounds().y

窗体宽高: .getBounds().width  getBounds().height

窗体拖动事件,见上一篇日志。(注意:事件是在窗体位置发生改变后执行,不是拖动中执行)

用到的变量及类,方法:

两个 boolean   1,state =true (窗体状态)2,AutopashState=true(线程执行条件)

一个多线程类,我这里写的是一个内部类,继承 Runnable 然后 在MainView 构造方法中设定开始执行。

见run方法

public void run() {
  // TODO Auto-generated method stub
  while(AutopashState)
  {

if(playlist!=null)
   {
    if(playlist.getBounds().x < (getXY().x+getXY().width+20) && 
      playlist.getBounds().x >= (getXY().x+getXY().width))     {

state=true;

}
      else
     state=false;
   }
   
   try {
    Thread.sleep(200);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

2,事件处理程序

public void ancestorMoved(AncestorEvent event) {
  if(state)  //当状态为真时,执行以下代码。
    {
  Rectangle rec= getXY();// 这里是我写的一个获得  MainView 作标的方法

// 当时头大,没有想到,可以用 MainView.this..getBounds()
  int x=rec.x,y=rec.y;
  playlist.setLocation(x+rec.width, y);
   playlist.setVisible(true);
  AutopashState=true;
    }
 }

异常分析:

1,当拖动窗体所触发事件:      CPU时间段1;

2,时时检测两窗体状态 :         CPU时间段2;

if(CPU时间段1>CPU时间段2)// 在这里说的就是哪个先执行完,CPU时间段不存在长段。

正常。

else if(CPU时间段1>CPU时间段2)//  也就是说 1 执行的条件发生了变化。据我分析也是正常的

,因为 此方法是从顺序执行。不是时时检测。

说明: 当拖动窗体时,线程检测程序,会分出一个线程用来检测,时时处理数据。当用户还在拖动未松开鼠标时,这时两个线程并行执行。所以 state 的值被赋值 false ,因为这个时候,第二个窗体的位置还没有变化,大于了20 。我刚才说了,这是两个线程在并行执行,所以哪个先执行谁也说不定,因为CPU不是那么听话。

以上是最正确的代码。

下面说一下错误之处

有人说时时改变不就行了,我想他说的可能是这样。

1,事情想的太简单

Rectangle rec= getXY();           // 低级程序员的想法
int x=rec.x,y=rec.y;

if(playlist.getBounds().x < (getXY().x+getXY().width+20) &&
      playlist.getBounds().x >= (getXY().x+getXY().width))

  playlist.setLocation(x+rec.width, y);

这样做也不全算错,如果窗体第次移动20个单位,那是正常的,如果移动的多了就不管事了

原因分析:

    假设两窗体距离在 20个单位之内时,当移动 主窗体 MainView 时,程序会比较

如果发现两个窗体相距的X作标相差在20个单位之内时,便会改变,否则不执行。

2,没有认真分析代码

if(state)
    {
    AutopashState=false; // 如果这里要是为false 那么 state =true;永不变化。
   Rectangle rec= getXY();
 int x=rec.x,y=rec.y;
 playlist.setLocation(x+rec.width, y);
   }
    else

{
     AutopashState=true;  }  // 让检测线程运行

代码分析:如注释所注,当线程停止时,也就不会有程序检测了所以一直为真。这样的效果就是,不管两窗体相距多远,都会自动 “粘到一起”。

3,有人说那就把else 去掉放在 if () 语句最下方。

if(state)
    {
    AutopashState=false; //
   Rectangle rec= getXY();
 int x=rec.x,y=rec.y;
 playlist.setLocation(x+rec.width, y);

 AutopashState=true; // 这个我也试验过了,可是有时会出异常,原因 我现在还没想到,只

          //是感觉 AutopashState=false; 没有执行。
   }

千千静听 窗口自动粘合,java 代码实现 源码分析相关推荐

  1. mq补偿机制java代码_RocketMQ源码分析之消息消费机制-消费端消息负载均衡机制与重新分布 - Java 技术驿站-Java 技术驿站...

    1.消息消费需要解决的问题 首先再次重复啰嗦一下RocketMQ消息消费的一些基本元素的关系 主题 ---> 消息队列(MessageQueue) 1 对多 主题 ----> 消息生产者, ...

  2. 基于ssh的航空订票系统-飞机订票系统javaweb-机票订购课程设计java代码(源码+数据库文件+文档)

    基于ssh的航空订票系统-飞机订票系统javaweb-机票订购java代码(源码+数据库文件+文档) 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 作者:IT跃迁谷 1.开发环境 开发语言: ...

  3. Java集合类框架源码分析 之 LinkedList源码解析 【4】

    上一篇介绍了ArrayList的源码分析[点击看文章],既然ArrayList都已经做了介绍,那么作为他同胞兄弟的LinkedList,当然必须也配拥有姓名! Talk is cheap,show m ...

  4. java.util.ServiceLoader源码分析

    java.util.ServiceLoader源码分析 回顾: ServiceLoader类的使用(具体参考博客http://blog.csdn.net/liangyihuai/article/det ...

  5. 并发编程5:Java 阻塞队列源码分析(下)

    上一篇 并发编程4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  6. Java并发-ReentrantReadWriteLock源码分析

    ReentrantLock实现了标准的互斥重入锁,任一时刻只有一个线程能获得锁.考虑这样一个场景:大部分时间都是读操作,写操作很少发生:我们知道,读操作是不会修改共享数据的,如果实现互斥锁,那么即使都 ...

  7. Java容器 | 基于源码分析List集合体系

    一.容器之List集合 List集合体系应该是日常开发中最常用的API,而且通常是作为面试压轴问题(JVM.集合.并发),集合这块代码的整体设计也是融合很多编程思想,对于程序员来说具有很高的参考和借鉴 ...

  8. JAVA集合专题+源码分析

    文章目录 Java集合专题 集合和数组的区别 数组 集合 区别 集合体系结构介绍 单列集合 [Collection ] Collection接口 迭代器 迭代器原理 增强for循环 List接口 对集 ...

  9. java并发:join源码分析

    join join join是Thread方法,它的作用是A线程中子线程B在运行之后调用了B.join(),A线程会阻塞直至B线程执行结束 join源码(只有继承Thread类才能使用) 基于open ...

  10. java activerecord.db_JFinal 源码分析 [DB+ActiveRecord]

    我记得以前有人跟我说,"面试的时候要看spring的源码,要看ioc.aop的源码"那为什么要看这些开源框架的源码呢,其实很多人都是"应急式"的去读,就像读一篇 ...

最新文章

  1. DevC++怎么更改背景颜色
  2. 堪比“脏牛”!“脏管道” 漏洞可获得Linux 所有主流发行版本的root权限
  3. vmware挂载共享目录
  4. 9.Linux/Unix 系统编程手册(上) -- 进程凭证
  5. java jdom 类_JDOM 介绍及使用指南
  6. 大写金额用计算机简单些,小写金额转换为大写金额(C实现)
  7. 『Java CVE』CVE-2022-34169: Xalan-J XSLT整数截断漏洞PoC结构再浅析
  8. xss labs 挑战之旅
  9. 【经典】非你莫属的名句二
  10. [codeforces366C]Dima and Salad
  11. 网站获得高质量外链的两大绝招
  12. Android MediaPlayer 音乐播放器扫描 本地音乐、上一曲、下一曲切歌、播放本地音乐
  13. 创客集结号:无人机发展的技术难点
  14. JavaScript 执行机制
  15. 001---函数基础
  16. 180512 tensorboard高维数据可视化
  17. 夜光带你走进 管理系统开发(一)擅长的领域
  18. IPv6转换难点分析之一:国家监测指标
  19. 如何从内存卡恢复丢失的数据?简单内存卡(SD卡)数据恢复方法分享
  20. poweroff 关机命令

热门文章

  1. 联咏平台(Novatek) | 走廊模式切换流程优化
  2. CS/CSS架构应用的软件性能测试模型分析
  3. Java学习到大神级别流程——转发自黑马程序员
  4. 被表情包支配的恐惧-轮播
  5. s7200plc软件无法通讯解决案例
  6. python字符串分割
  7. C语言if与else匹配规则你知道多少?
  8. 遇到用vnc-viewer连接,键盘Caps Lock不好使和小键盘错位的问题
  9. 项目管理~想要充分赢得下属信任,管理者如何做?
  10. 3DTouch 基本使用