標題:

java2個指令同時執行

發問:

aa.jpg

 

此文章來自奇摩知識+如有不便請留言告知

能不能讓2個指令同時執行因為剛啟動跑滑鼠指令進入球迴圈後滑鼠事件就停止監控了能一邊跑迴圈一邊控制滑鼠事件嗎??以下是我的程式import java.awt.event.*;import java.awt.*;import java.applet.Applet; public class jjjjj extends Applet implements MouseListener,MouseMotionListener{ int x=100,y=100,dx=-1,dy=1; int r=10; int X_MAX=640,Y_MAX=480; int X=0,Y=0;public... 顯示更多 能不能讓2個指令同時執行因為剛啟動跑滑鼠指令進入球迴圈後滑鼠事件就停止監控了能一邊跑迴圈一邊控制滑鼠事件嗎?? 以下是我的程式 import java.awt.event.*; import java.awt.*; import java.applet.Applet; public class jjjjj extends Applet implements MouseListener,MouseMotionListener{ int x=100,y=100,dx=-1,dy=1; int r=10; int X_MAX=640,Y_MAX=480; int X=0,Y=0; public void init() { addMouseListener(this); //加入滑鼠監聽者 addMouseMotionListener(this); //加入移動滑鼠監聽者 } public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e) { X = 0; Y = 10; showStatus(\"滑鼠進入applet\"); //顯示狀態列訊息 repaint(); } public void mouseExited(MouseEvent e) { X = 0; Y = 10; showStatus(\"滑鼠離開applet\"); //顯示狀態列訊息 repaint(); } public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseDragged(MouseEvent e){} public void mouseMoved(MouseEvent e) { X = e.getX(); Y = e.getY(); showStatus(\"滑鼠位置: \" + X + \", \" + Y); //顯示狀態列訊息 repaint(); } public void paint(Graphics www){ while(true){ www.drawLine(0,0,0,480); www.drawLine(0,0,640,0); www.drawLine(1,479,639,479); www.drawLine(639,1,639,479); try { Thread.sleep(0,100); } catch (Exception e) { System.err.println(e.toString()); } www.setColor(Color.WHITE); www.fillOval(x-r,y-r,r*2,r*2); x += dx; y += dy; if (x-r<=0.0) { x=r; dx=-dx; } if (x+r>=X_MAX) { x=X_MAX-r; dx=-dx; } if (y-r<=0.0) { y=r; dy=-dy; } if (y+r>=Y_MAX) { y=Y_MAX-r; dy=-dy; } System.out.print(x); System.out.print(\",\"); System.out.println(y); www.setColor(Color.BLACK); www.fillOval(x-r,y-r,2*r,2*r); } } } 更新: 上面的程式先不用解了幫忙說一下以下指令如何使用 Thread這個指令怎麼用 public void start() public void run()

最佳解答:

hi Billing , 當然可以同時跑兩段程式, 但是你的寫法不行, 因為只有一個執行緒(Thread), 所以當你程式進入 paint 的 while loop 時, 該Thread的主控權就被完全佔用了, 所以形同當機. 必須產生另一個Thread才能同時執行畫面不斷的update(paint), 原來的Thread還給系統. 最簡單寫法就是本程式實作(implements) Runnable(Thread 的父類別). 然後在 inti 的最後面起始一個新Thread(this 其實就是本程式)呼叫start, start 自動呼叫 run. 所以 while loop 放在 run, run只負責呼叫 repaint 就行了, 此程式就跑的完美了. 程式如下 : import java.awt.event.*; import java.awt.*; import java.applet.Applet; public class jjjjj extends Applet implements MouseListener,MouseMotionListener, Runnable { //<--- 實作 Runnable int x=100,y=100,dx=-1,dy=1; int r=10; int X_MAX=640,Y_MAX=480; int X=0,Y=0; public void init() { addMouseListener(this); //加入滑鼠監聽者 addMouseMotionListener(this); //加入移動滑鼠監聽者 new Thread(this).start(); //<--- 起始另一個Thread去執行本程式paint } public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e) { X = 0; Y = 10; showStatus("滑鼠進入applet"); //顯示狀態列訊息 repaint(); } public void mouseExited(MouseEvent e) { X = 0; Y = 10; showStatus("滑鼠離開applet"); //顯示狀態列訊息 repaint(); } public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseDragged(MouseEvent e){} public void mouseMoved(MouseEvent e) { X = e.getX(); Y = e.getY(); showStatus("滑鼠位置: " + X + ", " + Y); //顯示狀態列訊息 repaint(); } public void paint(Graphics www){ //while(true){ //<--- 刪除 while loop www.drawLine(0,0,0,480); www.drawLine(0,0,640,0); www.drawLine(1,479,639,479); www.drawLine(639,1,639,479); /* //<--- 刪除 sleep try { Thread.sleep(0,100); } catch (Exception e) { System.err.println(e.toString()); } */ www.setColor(Color.WHITE); www.fillOval(x-r,y-r,r*2,r*2); x += dx; y += dy; if (x-r<=0.0) { x=r; dx=-dx; } if (x+r>=X_MAX) { x=X_MAX-r; dx=-dx; } if (y-r<=0.0) { y=r; dy=-dy; } if (y+r>=Y_MAX) { y=Y_MAX-r; dy=-dy; } www.setColor(Color.BLACK); www.fillOval(x-r,y-r,2*r,2*r); //} } //<--- 新的 Thread.start 呼叫本程式 run public void run() { while (true) { try { Thread.sleep(0,100); } catch (Exception e) { System.err.println(e.toString()); } repaint(); //<--- 細統呼叫 paint } } }

其他解答:F6C3603064EF4E9D
arrow
arrow

    bgdwze3 發表在 痞客邦 留言(0) 人氣()