Swing组件冻结(Java)
我用Swing组件编写了一个复杂的蛇游戏。 我有一个计时器(称之为moveRate),它调用repaint();每x毫秒(x在游戏中改变,并且永远不会低于50)。 现在来看问题:在整个画面冻结之前,我成功地玩了大约4分钟 移动速率等级: 框架仍然冻结。 gc();如果我每30秒计时一次也不行 对我放松点,因为我是Java的大三学生:> 编辑Swing组件冻结(Java),java,swing,timer,components,event-dispatch-thread,Java,Swing,Timer,Components,Event Dispatch Thread,我用Swing组件编写了一个复杂的蛇游戏。 我有一个计时器(称之为moveRate),它调用repaint();每x毫秒(x在游戏中改变,并且永远不会低于50)。 现在来看问题:在整个画面冻结之前,我成功地玩了大约4分钟 移动速率等级: 框架仍然冻结。 gc();如果我每30秒计时一次也不行 对我放松点,因为我是Java的大三学生:> 编辑 我试图通过延长蛇的长度(更长得多——使用我的最终int snake_INITIAL_LENGTH=200)来复制“bug”。似乎对问题没有任何影响。对于初学
我试图通过延长蛇的长度(更长得多——使用我的最终int snake_INITIAL_LENGTH=200)来复制“bug”。似乎对问题没有任何影响。对于初学者,不要扩展
计时器。这完全是不自然的。这是我目前所知道的。虽然不太好,但我正在学习。有没有一种解决方案可以让它保持原样而不改变Library?或者这是不可避免的?gui冻结通常意味着您正在通过EDT访问视图和/或其属性-因此第一步是了解swing中的并发性(请参见swing标记wiki中的链接),最好显示一个演示问题的SSCCE单击“信息”选项卡…开始,在“了解更多”下的标签中引用。
class MoveRate extends Timer{
private Date dateCreated=new Date();
private long timeLast=0;
public MoveRate(){
super(190, null);
dateCreated=new Date();
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(getWidth()>0 && getHeight()>0){
if(points.get(0).x+HOPS>getWidth() || points.get(0).x<0 ||
points.get(0).y+HOPS>getHeight() || points.get(0).y<0)
if(!crosswalls && !cheats){
moveRate.stop();
prizeRate.stop();
GameOver();
}
else{
if(points.get(0).y<0)
points.get(0).y=sp.getHeight()-HOPS;
else if(points.get(0).y+HOPS>sp.getHeight())
points.get(0).y=0;
else if(points.get(0).x<0)
points.get(0).x=sp.getWidth()-HOPS;
else
points.get(0).x=0;
}
timeLast=(System.currentTimeMillis()-dateCreated.getTime())/SECONDS;
score+=timeLast*(200/moveRate.getDelay());
}
if(prize!=null)
if(points.get(0).x==prize.x && points.get(0).y==prize.y){
int newX = points.get(points.size()-1).x-(points.get(points.size()-1).x - points.get(points.size()-2).x);
int newY = points.get(points.size()-1).y-(points.get(points.size()-1).y - points.get(points.size()-2).y);
points.add(new Point(newX, newY));
if(moveRate.getDelay()>50)
moveRate.setDelay(moveRate.getDelay()-5);
prize.createPrize(PU_NONE);
prizeRate.restart();
score+=timeLast*20*eatmultiplier;
}
if(powerup!=null)
if(points.get(0).x==powerup.x && points.get(0).y==powerup.y){
int newX = points.get(points.size()-1).x-(points.get(points.size()-1).x - points.get(points.size()-2).x);
int newY = points.get(points.size()-1).y-(points.get(points.size()-1).y - points.get(points.size()-2).y);
//points.add(new Point(newX, newY)); //if powerup should increase size
powerUpPerform(powerup.getType());
if(moveRate.getDelay()>50)
moveRate.setDelay(moveRate.getDelay()-5);
//powerUpRate.restart();
score+=timeLast*20*eatmultiplier;
powerup=null;
}
p.setScore(score);
repaint();
}
});
}
}
new Thread(new Runnable() {
public void run() {
moveRate=new MoveRate();
moveRate.start();
powerUpRate.start();
prizeRate.start();
}
}).start();