2015-02-11 57 views
-2

我正在做一個簡單的java遊戲來學習它。我想要一個有方形女巫的程序,你可以點擊它,它會改變顏色,比我不希望能夠敲擊它8秒。我知道我不會讓計時器變得更高,我這樣做的目的是爲了檢查在使用睡眠之前是否可以先退出計時器。JAVA線程似乎不工作

雖然這樣做我的程序卡住了,我不能關閉它,所以我嘗試線程,但它仍然無法正常工作。有人能告訴我我做錯了什麼嗎?

import javax.swing.*; 
import java.awt.*; 
class ViewControll extends JFrame 
{ 
JPanel playerPanel; 
Dimension playerPlotDimension; 
Plot plot00; 
Thread t; 

public ViewControll() 
{ 
    playerPlotDimension=new Dimension(200,200); 
    plot00 = new Plot(playerPlotDimension); 
    t= new Thread(plot00); 
    createAndShowGUI(); 
} 

private void createAndShowGUI() 
{ 
    setTitle("ALPHA 0.1"); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setLayout(new FlowLayout()); 
    setSize(400,400); 
    setVisible(true); 
    t.start(); 
    add(plot00);  

} 

public static void main(String args[]) 
{ 
    new ViewControll(); 
} 


} 

在這裏,第二類

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.BorderFactory; 
import javax.swing.JPanel; 

public class Plot extends JPanel implements Runnable 
{ 
int plotstate; 
int timer; 

public Plot(Dimension playerPlotDimension) 
{ 
    plotstate =0; 
    timer =0; 
    setBackground(Color.GRAY); 
    setPreferredSize(playerPlotDimension); 
    setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY,5,true)); 
    setToolTipText("Werkt Dit?"); 
} 

@Override 
public void run() 
{ 
    addMouseListener(new MouseAdapter() 
    { 
      public void mousePressed(MouseEvent me) 
      { 

      switch (plotstate) 
      { 
       case 0: setBackground(Color.GREEN); 
         plotstate = 1; 
       break; 
       case 1: setBackground(Color.DARK_GRAY); 
         while (timer != 8) 
         { 
         plotstate =0; 
         } 
       break; 
      } 
      } 
    }); 

} 







} 
+0

你在哪裏遞增計時器? – Anto 2015-02-11 10:32:00

+2

你的線程所做的就是添加一個MouseListener。在另一個線程中執行此操作不會產生任何影響;監聽器本身將在事件派發線程上被調用。 – yole 2015-02-11 10:32:49

+0

我刪除了定時器增量以測試它是否會留在循環中。所以我使用線程錯誤?我應該如何使用它? – Zeepblok 2015-02-11 10:49:06

回答

0

我固定它這樣的,這是一個很好的sollution?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.BorderFactory; 
import javax.swing.JPanel; 


public class Plot extends JPanel implements Runnable 
{ 
int plotstate; 
int growtimer; 

public Plot(Dimension playerPlotDimension) 
{ 
    plotstate =0; 
    growtimer =0; 
    setBackground(Color.GRAY); 
    setPreferredSize(playerPlotDimension); 
    setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY,5,true)); 
    setToolTipText("Werkt Dit?"); 

    addMouseListener(new MouseAdapter() 
    { 
      public void mousePressed(MouseEvent me) 
      { 

      switch (plotstate) 
      { 
       case 0: setBackground(Color.GREEN); 
         plotstate = 1; 
       break; 
       case 1: setBackground(Color.DARK_GRAY); 
         run(); 
       break; 
      } 
      } 
    }); 


} 


@Override 
public void run() 
{ 
    while (growtimer != 8) 
    { 
     plotstate =0; 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     growtimer++;   
    } 
} 
+0

你必須告訴...工作? – 2015-02-11 12:40:36

+0

您的Plot#run()方法在八秒鐘內增加八次growtimer,但是完成了什麼?你的代碼在什麼地方看着成長者? – 2015-02-11 14:12:23

+0

我想讓它睡8秒,然後改變它的plotstate .....我只是回答我自己的問題...爲什麼我使用while循環,我不需要它哈哈 – Zeepblok 2015-02-11 15:32:53

0

如果你希望你的陰謀是「已禁用」,持續8秒,你爲什麼不只是存儲的點擊時間,然後忽略後續的點擊,而在8秒沒有過去呢? 類似的東西:

public class Plot extends JPanel implements Runnable 
{ 
int plotstate; 
long clicktime; 
... 
public Plot(Dimension playerPlotDimension) 
{ 
    plotstate =0; 
    growtimer =0; 
    setBackground(Color.GRAY); 
    setPreferredSize(playerPlotDimension); 
    setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY,5,true)); 
    setToolTipText("Werkt Dit?"); 

    addMouseListener(new MouseAdapter() 
    { 
      public void mousePressed(MouseEvent me) 
      { 

      switch (plotstate) 
      { 
       case 0: setBackground(Color.GREEN); 
         plotstate = 1; 
         clicktime = System.currentMillis(); 
       break; 
       case 1: setBackground(Color.DARK_GRAY); 
         if (System.currentMillis() - clicktime > 8000) 
         { 
         plotstate = 0; 
         } 
       break; 
      } 
      } 
    }); 


}