工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1616|回复: 0

[代码批斗会]JAVA作业。。

[复制链接]
发表于 2007-12-12 16:02 | 显示全部楼层 |阅读模式
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 编辑 ]
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-14 22:43

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表