|
Thinking In JAVA
JAVA作业..
正弦曲线动画
书中的一个包...其中 run 方法被静态导入
实现 JFrameObject.setSize setVisible SetDefaultCloseOperation 这几个操作
package net.mindview.util;
import javax.swing.*;
public class SwingConsole {
public static void
run(final JFrame f,final int width,final int height){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
f.setTitle(f.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(width,height);
f.setVisible(true);
}
});
}
}
原本的SineWave.java操作流程:
跟据长,宽,周期数,生成所有点的位置
并跟据位置进行 drawLine 一次性显示
每次 adjustCycle 被改变则修改 cycles 并repaint
经我修改过的P1361 的SineWave.java
重命名为 TestSwing.java了..
原本只是静态画出正弦图,下端的Slider adjustCycle 控制显示的正弦的周期个数
添加Slider adjustInterval 控制动画显示的速度
动画用Timer 显示
继承一个TimerTask: Animation
把原本放在 paintComponent 方法里面的 用for遍历所有点进行 drawLine 的操作
用一个新的函数 drawIt() 来实现,并且每次 drawIt只画一个点
drawIt给 Animation 调用,所以Animation构造函数要传递 SineWave 的引用。
说得很混乱 ...有兴趣的看代码吧
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import static net.mindview.util.SwingConsole.*;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Date;
public class TestSwing extends JFrame {
private SineDraw sines=new SineDraw();
private JSlider adjustCycles=new JSlider(1,30,5);
private JSlider adjustTimer=new JSlider(1,100,5);
public TestSwing(){
add(sines);
add(BorderLayout.SOUTH,adjustCycles);
add(BorderLayout.NORTH,adjustTimer);
adjustCycles.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){
sines.setCycles( ((JSlider)e.getSource()).getValue() );
}
});
adjustTimer.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){
sines.setInterval(((JSlider)e.getSource()).getValue());
}
});
}
public static void main(String[] args){
run(new TestSwing(),700,600);
}
}
class SineDraw extends JPanel{
class Animation extends TimerTask{
private SineDraw sd;
public Animation(SineDraw sd_){
sd=sd_;
}
public void run(){
double hstep = (double)sd.getWidth() / (double)sd.points;
++sd.currentPoint;
if(sd.currentPoint>=sd.points){
sd.currentPoint=0;
sd.repaint();
cancel();
return;
}
sd.drawIt(sd.getGraphics(),hstep);
}
}
private static final int SCALEFACTOR = 200;
private int cycles;
private int points;
private double[] sines;
private int[] pts;
public int currentPoint=1; //The current drawing point
private int interval;
private Timer timer=new Timer(false);
public SineDraw(){
setCycles(5);
interval=5;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
currentPoint=1;
int maxHeight = getHeight();
pts=new int[points];
for(int j = 0;j<points;++j){
pts[j]=(int)(sines[j]*maxHeight/2*.95+maxHeight/2);
}
g.setColor(Color.RED);
//currentPoint=1;
timer=new Timer();
timer.schedule(new Animation(this),new Date(),interval);
}
public void drawIt(Graphics g, double hstep){
int x1=(int)((currentPoint-1)*hstep);
int x2=(int)(currentPoint*hstep);
int y1=pts[currentPoint-1];
int y2=pts[currentPoint];
g.setColor(Color.RED);
g.drawLine(x1,y1,x2,y2);
}
public void setInterval(int it_){
interval=it_;
timer.cancel();
repaint();
}
public void setCycles(int newCycles){
cycles=newCycles;
points=SCALEFACTOR*cycles*2;
sines=new double[points];
for(int j=0;j<points;++j){
double radians = (Math.PI/SCALEFACTOR)*j;
sines[j]=Math.sin(radians);
}
timer.cancel();
repaint();
}
} 
[ 本帖最后由 iptton 于 2007-12-12 16:04 编辑 ] |
|