2015-02-11 58 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; 
      } 
      } 
    }); 


}