CompMover.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:3k
源码类别:

进程与线程

开发平台:

Java

  1. import java.awt.*;
  2. import javax.swing.*;
  3. public class CompMover extends Object {
  4. private Component comp;
  5. private int initX;
  6. private int initY;
  7. private int offsetX;
  8. private int offsetY;
  9. private boolean firstTime;
  10. private Runnable updatePositionRun;
  11. private Thread internalThread;
  12. private volatile boolean noStopRequested;
  13. public CompMover(Component comp, 
  14. int initX, int initY,
  15. int offsetX, int offsetY
  16. ) {
  17. this.comp = comp;
  18. this.initX = initX;
  19. this.initY = initY;
  20. this.offsetX = offsetX;
  21. this.offsetY = offsetY;
  22. firstTime = true;
  23. updatePositionRun = new Runnable() {
  24. public void run() {
  25. updatePosition();
  26. }
  27. };
  28. noStopRequested = true;
  29. Runnable r = new Runnable() {
  30. public void run() {
  31. try {
  32. runWork();
  33. } catch ( Exception x ) {
  34. // in case ANY exception slips through
  35. x.printStackTrace(); 
  36. }
  37. }
  38. };
  39. internalThread = new Thread(r);
  40. internalThread.start();
  41. }
  42. private void runWork() {
  43. while ( noStopRequested ) {
  44. try {
  45. Thread.sleep(200);
  46. SwingUtilities.invokeAndWait(updatePositionRun);
  47. } catch ( InterruptedException ix ) {
  48. // ignore
  49. } catch ( Exception x ) {
  50. x.printStackTrace();
  51. }
  52. }
  53. }
  54. public void stopRequest() {
  55. noStopRequested = false;
  56. internalThread.interrupt();
  57. }
  58. public boolean isAlive() {
  59. return internalThread.isAlive();
  60. }
  61. private void updatePosition() {
  62. // should only be called by the *event* thread
  63. if ( !comp.isVisible() ) {
  64. return;
  65. }
  66. Component parent = comp.getParent();
  67. if ( parent == null ) {
  68. return;
  69. }
  70. Dimension parentSize = parent.getSize();
  71. if ( ( parentSize == null ) &&
  72.  ( parentSize.width < 1 ) && 
  73.  ( parentSize.height < 1 ) 
  74.    ) {
  75. return;
  76. }
  77. int newX = 0;
  78. int newY = 0;
  79. if ( firstTime ) {
  80. firstTime = false;
  81. newX = initX;
  82. newY = initY;
  83. } else {
  84. Point loc = comp.getLocation();
  85. newX = loc.x + offsetX;
  86. newY = loc.y + offsetY;
  87. }
  88. newX = newX % parentSize.width;
  89. newY = newY % parentSize.height;
  90. if ( newX < 0 ) {
  91. // wrap around other side
  92. newX += parentSize.width;
  93. }
  94. if ( newY < 0 ) {
  95. // wrap around other side
  96. newY += parentSize.height;
  97. }
  98. comp.setLocation(newX, newY);
  99. parent.repaint();
  100. }
  101. public static void main(String[] args) {
  102. Component[] comp = new Component[6];
  103. comp[0] = new ScrollText("Scrolling Text");
  104. comp[1] = new ScrollText("Java Threads");
  105. comp[2] = new SlideShow();
  106. comp[3] = new SlideShow();
  107. comp[4] = new DigitalTimer();
  108. comp[5] = new DigitalTimer();
  109. JPanel p = new JPanel();
  110. p.setLayout(null); // no layout manager
  111. for ( int i = 0; i < comp.length; i++ ) {
  112. p.add(comp[i]);
  113. int x = (int) ( 300 * Math.random() );
  114. int y = (int) ( 200 * Math.random() );
  115. int xOff = 2 - (int) ( 5 * Math.random() );
  116. int yOff = 2 - (int) ( 5 * Math.random() );
  117. new CompMover(comp[i], x, y, xOff, yOff);
  118. }
  119. JFrame f = new JFrame("CompMover Demo");
  120. f.setContentPane(p);
  121. f.setSize(400, 300);
  122. f.setVisible(true);
  123. }
  124. }