| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1637 人关注过本帖
标题:模拟单摆运动的小程序,为什么不动咧??
只看楼主 加入收藏
cll19820814
Rank: 2
等 级:新手上路
威 望:3
帖 子:328
专家分:0
注 册:2005-11-30
收藏
 问题点数:0 回复次数:12 
模拟单摆运动的小程序,为什么不动咧??

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class DanBai
{ public static void main(String[] args)
{ JFrame f = new DFrame("DanBai");
f.show();
}
}

class DFrame extends JFrame
{ public DFrame(String title)
{ super(title);
setSize(300, 200);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent evt)
{ System.exit(0); }
});
getContentPane().add(new DPanel());
}
}

class DPanel extends JPanel
implements TimerListener
{ public DPanel()
{ Timer t = new Timer(1000);
t.addTimerListener(this);
}

public void timeElapsed(TimerEvent evt)
{ Graphics g = getGraphics();
int x1, y1, x2, y2 = 0, r = 160, t = 5;
double b = 30, a = this.getWidth();
x2 = (int)(a / 2);
x1 = (int)(x2 - Math.sin(b * Math.PI / 180) * r);
y1 = (int)(Math.cos(b * Math.PI / 180) * r);
g.drawLine(x1, y1, x2, y2);
g.fillOval(x1 - t, y1 - t, 2 * t, 2 * t);
if(b >= 30) b--;
else if (b <= 30) b++;
g.dispose();
}
}

interface TimerListener extends EventListener
{ public void timeElapsed(TimerEvent evt);
}

class Timer extends Component implements Runnable
{ public Timer(int i)
{ interval = i;
Thread t = new Thread(this);
t.start();
evtq = Toolkit.getDefaultToolkit().getSystemEventQueue();
enableEvents(0);
}

public void addTimerListener(TimerListener l)
{ listener = l;
}

public void run()
{ while (true)
{ try { Thread.sleep(interval); }
catch(InterruptedException e) {}
TimerEvent te = new TimerEvent(this);
evtq.postEvent(te);
}
}

public void processEvent(AWTEvent evt)
{ if (evt instanceof TimerEvent)
{ if (listener != null)
listener.timeElapsed((TimerEvent)evt);
}
else super.processEvent(evt);
}
private int interval;
private TimerListener listener;
private static EventQueue evtq;
}

class TimerEvent extends AWTEvent
{ public TimerEvent(Timer t) { super(t, TIMER_EVENT); }
public static final int TIMER_EVENT
= AWTEvent.RESERVED_ID_MAX + 5555;
}
程序后半段是抄书的,哪位可以帮我解释一下吗??

[此贴子已经被作者于2005-12-30 16:17:55编辑过]

搜索更多相关主题的帖子: 单摆 模拟 运动 
2005-12-30 16:16
cll19820814
Rank: 2
等 级:新手上路
威 望:3
帖 子:328
专家分:0
注 册:2005-11-30
收藏
得分:0 
麻烦看看我的哪里不对啊 ~~~~~求助啊~~~

懵懵懂懂,看千遍而不会;设身处地,试一下就成功!
2005-12-30 20:17
tody
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2005-11-17
收藏
得分:0 
小弟有难大哥来帮你了!!
用下面的把你程序里面相同的地方替换掉:
class DPanel extends JPanel implements TimerListener
{
boolean a = true;
int x1, y1,x2, y2 = 0,r = 160, t = 5;
int b = 30;
public DPanel()
{ Timer t = new Timer(1000);
t.addTimerListener(this);
}
public void timeElapsed(TimerEvent evt) {
getGraphics().clearRect(0,0,this.getWidth(),this.getHeight());
x2 = (int)(this.getWidth()/ 2);
x1 = (int)(x2-Math.sin(b * Math.PI / 180) * r);
y1 = (int)(Math.cos(b * Math.PI / 180) * r);
getGraphics().drawLine(x1, y1, x2, y2);
getGraphics().fillOval(x1 - t, y1 - t, 2 * t, 2 * t);
if(a){
b-=10;
if(b <= -30) a=false;
}
else if(!a){
b+=10;
if(b >= 30) a=true;
}
}
}

[此贴子已经被作者于2005-12-31 10:21:32编辑过]


记录就是用来破的, 自尊就是用来伤的。
2005-12-31 09:37
tody
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2005-11-17
收藏
得分:0 

至于为什么有错,你自己想想,原因很简单,重复赋值,
在+上有些逻辑错误~~


记录就是用来破的, 自尊就是用来伤的。
2005-12-31 09:39
tody
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2005-11-17
收藏
得分:0 
对了,在+上句 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
否则你的程序表面关了,进程里还有(可是你的程序我一开始就连表面的都没关掉

[此贴子已经被作者于2005-12-31 9:42:06编辑过]


记录就是用来破的, 自尊就是用来伤的。
2005-12-31 09:40
cll19820814
Rank: 2
等 级:新手上路
威 望:3
帖 子:328
专家分:0
注 册:2005-11-30
收藏
得分:0 
但是我加了
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent evt)
{ System.exit(0); }这句啊?
我正好要问这句和 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);这句有什么不同啊?
是不是上面那句关掉整个程序,而 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);这句只关掉一个Frame啊??

懵懵懂懂,看千遍而不会;设身处地,试一下就成功!
2005-12-31 10:40
cll19820814
Rank: 2
等 级:新手上路
威 望:3
帖 子:328
专家分:0
注 册:2005-11-30
收藏
得分:0 
我大概知道哪错了,首先 this.getWidth()不是double 而是 int型的;
还有那个判断,一次之后就没用了,b一直停留在 29~

懵懵懂懂,看千遍而不会;设身处地,试一下就成功!
2005-12-31 10:42
tody
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2005-11-17
收藏
得分:0 

没看见,不好意思

回答完全错误。。。


在你的程序里面:
int x1, y1, x2, y2 = 0, r = 160, t = 5;
调用一次,初试化一次

然后后面又计算出值,到调用又初始化然后又。。。
能动就怪了。。。

[此贴子已经被作者于2005-12-31 10:47:54编辑过]


记录就是用来破的, 自尊就是用来伤的。
2005-12-31 10:42
cll19820814
Rank: 2
等 级:新手上路
威 望:3
帖 子:328
专家分:0
注 册:2005-11-30
收藏
得分:0 
还是老大哥照顾我呀 哈哈哈
再帮我看看后面的Timer是怎么做的嘛~

懵懵懂懂,看千遍而不会;设身处地,试一下就成功!
2005-12-31 10:44
tody
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2005-11-17
收藏
得分:0 
Timer怎么了?!

记录就是用来破的, 自尊就是用来伤的。
2005-12-31 10:49
快速回复:模拟单摆运动的小程序,为什么不动咧??
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027353 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved