首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

跪求用java中的SWT做的动态效果图解决办法

2012-01-16 
跪求用java中的SWT做的动态效果图我学习java时间很短,三四个月,一直想用SWT来制作一个小面板的连续翻转的

跪求用java中的SWT做的动态效果图
我学习java时间很短,三四个月,一直想用SWT来制作一个小面板的连续翻转的动态效果,但我查了一些书籍,好像只有用线程才能实现,就是在一个新建的线程中让它完成翻转,然后sleep(1000),然后在翻转,这样就应该有动态效果了啊,可是我做完之后,却发现实现不了。我就是想问一下我的这个用线程来实现动态效果的想法对不对,要是对的话,求高手帮忙指点,需要注意哪些问题啊?(最好是有一个例子,让我来学习学习啊! 呵呵!)

[解决办法]
给楼主2个简单例子,是个小球。

Java code
package com.asia.thread;import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import java.util.*;import javax.swing.*;/** * 单线程,小球演示 搜索不到,run()方法/.start() */public class Bounce {    public static void main(String[] args) {        JFrame frame = new BounceFrame();        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // similar to                                                                // window                                                                // listener        frame.show();    }}class BounceFrame extends JFrame {    private BallCanvas canvas;    public BounceFrame() {        setSize(600, 500);        setTitle("Bounce Ball");        Container contentPane = getContentPane();        canvas = new BallCanvas();        contentPane.add(canvas, BorderLayout.CENTER); // add canvas to teh                                                        // container of frame        JPanel buttonPanel = new JPanel();        addButton(buttonPanel, "Start", new ActionListener() {            public void actionPerformed(ActionEvent evt) {                addBall(); // call method            }        });        addButton(buttonPanel, "Close", new ActionListener() {            public void actionPerformed(ActionEvent evt) {                System.exit(0);            }        });        contentPane.add(buttonPanel, BorderLayout.SOUTH);    }    public void addButton(Container c, String title, ActionListener listener) {        JButton button = new JButton(title);        c.add(button); // add button to panel        button.addActionListener(listener);    }    public void addBall() {        // try{        Ball b = new Ball(canvas);        canvas.add(b); // add ball to canvas        for (int i = 1; i <= 1000; i++) {            b.move();            // main()单线程运行,无法每次move()后,sleep()等一会儿,减慢速度。只有想别的办法,比如改变步长。但立即会有一蹿一蹿的跳跃感。                        /*            for (int t = 0; t < 100; t++) { // 只有:每次move()一个小步长,然后for()空循环耗去一段时间。                System.out.println();            }            */                            try {                    Thread.currentThread().sleep(5);                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }    //main()也是一个线程。一样可以用线程操控的招。                        // 还可以:Timer(),用定时器,每次xxx毫秒后,触发事件处理器,事件处理方法中.move();        }        // }        // catch (InterruptedException e) {}    }}class BallCanvas extends JPanel {    private ArrayList balls = new ArrayList();    public void add(Ball b) {        balls.add(b); // add to list    }    public void paintComponent(Graphics g) {        super.paintComponent(g);        Graphics2D g2 = (Graphics2D) g;        for (int i = 0; i < balls.size(); i++) {            Ball b = (Ball) balls.get(i);            b.draw(g2);        }    }}class Ball {    private Component canvas;    private int x = 0;    private int y = 0;    private int dx = 2; // 小球每次移动步长。循环----调用.move()----x=x+dx;    private int dy = 2; // 因为是单线程,独占cpu,所以跑得快。    public Ball(Component c) {        canvas = c;    }    public void draw(Graphics2D g2) {        g2.fill(new Ellipse2D.Double(x, y, 15, 15));    }    public void move() {        x += dx;        y += dy;        if (x < 0) {            x = 0;            dx = -dx;        }        if (x + 15 >= canvas.getWidth()) {            x = canvas.getWidth() - 15;            dx = -dx;        }        if (y < 0) {            y = 0;            dy = -dy;        }        if (y + 15 >= canvas.getHeight()) {            y = canvas.getHeight() - 15;            dy = -dy;        }        canvas.paint(canvas.getGraphics());    }} 


[解决办法]
另外一个

Java code
package com.asia.thread;import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import java.util.*;import javax.swing.*;/** * 多线程,小球演示. 打开Windows任务管理器,可看到线程变化。 可搜索到,run()方法/.start() *  * du: 程序技巧体会: 所谓产生一个小球,即是 new 其类对象,其属性携带画小球的 坐标、颜色、所在容器 等参数。 *  * 一个类,属性用来作为参数容器用, 方法....完成功能。 * */// 运行类public class BouncePress {    //    public static void main(String[] args) {        JFrame frame = new BouncePressFrame(); // 生成窗口。执行构造。-----业务逻辑。        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // similar to                                                                // window                                                                // listener        frame.show();    }}class BouncePressFrame extends JFrame {    private BallPressCanvas canvas;    public BouncePressFrame() {        setSize(600, 500); // 窗口大小        setTitle("Bounce Ball");        Container contentPane = getContentPane(); // Swing的窗口不能直接放入东西,只能在其上的ContentPane上放。        canvas = new BallPressCanvas(); // 生成一个新面板。-----canvas        contentPane.add(canvas, BorderLayout.CENTER); // 窗口中心 加入该面板。        JPanel buttonPanel = new JPanel(); // 再生成一个新面板。----buttonPanel        // 调用本类方法addButton。        addButton(buttonPanel, "Start", // 生成一个按钮"Start"---加入面板buttonPanel                new ActionListener() { // |------>按钮绑上 action监听器。                    public void actionPerformed(ActionEvent evt) { // | 小球容器对象的                        addBall(Thread.NORM_PRIORITY - 4, Color.black); // 事件处理时,执行---addBall()方法。--->产生小球(参数对象)--->加入List中--->开始画球。                    }                }); // 按一次,addBall()一次--->产生一个新小球--->加入List中--->开始画此新小球。                    // --->画球线程BallPressThread的run()--->小球(参数对象).move()--->每次画时,先移动,再判断,再画。                    // --->BallPressCanvas类的canvas对象.paint()--->自动调BallPressCanvas类的paintComponent(Graphics                    // g)方法。                    // --->该方法,从List中循环取出所有小球,第i个球,--->调该小球BallPress类                    // .draw()方法--->调Graphics2D方法画出小球。--使用color/        addButton(buttonPanel, "Express", new ActionListener() {            public void actionPerformed(ActionEvent evt) {                addBall(Thread.NORM_PRIORITY + 2, Color.red);            }        });        addButton(buttonPanel, "Close", new ActionListener() {            public void actionPerformed(ActionEvent evt) {                System.exit(0);            }        });        contentPane.add(buttonPanel, BorderLayout.SOUTH);    }    public void addButton(Container c, String title, ActionListener listener) {        JButton button = new JButton(title); // 生成一个按钮。        c.add(button); // 加入容器中。        button.addActionListener(listener); // 按钮绑上 action监听器。    }    /** 主要业务方法。 */    public void addBall(int priority, Color color) {        // 生成 小球(参数对象)        BallPress b = new BallPress(canvas, color); // 生成BallPress对象,携带、初始化                                                    // 画Ball形小球,所需参数:所在容器组件,所需color--black/red.        // 小球加入 List中。        canvas.add(b); // 面板canvas 的ArrayList中 加入BallPress对象。        BallPressThread thread = new BallPressThread(b); // 生成画小球的线程类BallPressThread对象。传入BallPress对象(携带了画球所需                                                            // 容器、color参数)。        thread.setPriority(priority);        thread.start(); // call run(), ball start to move        // 画球线程开始。--->BallPressThread的run()--->小球(参数对象).move()--->先移动,再画。canvas.paint--->BallPressCanvas类的    }}// 画球的线程类。class BallPressThread extends Thread {    private BallPress b;    public BallPressThread(BallPress aBall) {        b = aBall;    }    // 画球开始。    public void run() {        try {            for (int i = 1; i <= 1000; i++) { // 画1000次。                b.move(); // 每次画时,先移动,再判断,再画。                sleep(5); // 所以移动比Bounce.java的球慢。            }        } catch (InterruptedException e) {        }    }}// swing面板类.// 作用1) 本类面板对象.paint()方法---->自动绘制面板,且自动调paintComponent(Graphics// g)方法,--->重写该方法,绘制面板(及其上组件)。// 作用2) 该类对象 属性ArrayList balls---兼作小球(参数对象)的容器。class BallPressCanvas extends JPanel {    private ArrayList balls = new ArrayList();    public void add(BallPress b) {        balls.add(b); // 向ArrayList中添加球。当按下按钮,添加多个球时,都保存在这个List中。    }    // 重写了 javax.swing.JComponent的 paintComponent()方法。    // paint()方法自动调用该方法。    public void paintComponent(Graphics g) {        super.paintComponent(g);        Graphics2D g2 = (Graphics2D) g;        for (int i = 0; i < balls.size(); i++) { // 循环            BallPress b = (BallPress) balls.get(i); // 从List中取出第i个球,            b.draw(g2); // 画此球。        }    }}/** * 画出球。 *  * 在 canvas上画出,color色的小球图形。 *  * 属性,可用于携带画小球所需参数。 *  *  *  * @author ducongan *  */class BallPress {    private Component canvas;    private Color color;    private int x = 0;    private int y = 0;    private int dx = 2;    private int dy = 2;    // 构造 初始化 容器 颜色 参数。    public BallPress(Component c, Color aColor) {        canvas = c;        color = aColor;    }    // 制定位置,画出小球。    public void draw(Graphics2D g2) {        g2.setColor(color);        g2.fill(new Ellipse2D.Double(x, y, 15, 15)); // ellipse:椭圆形    }    // 移动小球。    // 每次画时,先移动,再判断,再画。    // 该方法每次执行,画小球的起点坐标 (x,y), 每次各自+2, 即斜向右下运动。    public void move() {        x += dx; // x=x+dx; 画小球的起点坐标 (x,y), 每次各自+2, 即斜向右下运动。        y += dy; // y=y+dy;        if (x < 0) { // 小球已到左边框。保证,从左边框开始画。            x = 0;            dx = -dx; // 小球横坐标变化值取反。开始反向运动。        }        if (x + 15 >= canvas.getWidth()) { // 小球右边已经到画板右边。            x = canvas.getWidth() - 15;            dx = -dx; // 开始反向运动。        }        if (y < 0) { // 保证,从顶框开始画。            y = 0;            dy = -dy;        }        if (y + 15 >= canvas.getHeight()) { // 小球已到画板顶。            y = canvas.getHeight() - 15;            dy = -dy;        }        canvas.paint(canvas.getGraphics()); // 画出面板对象canvas----(及其上所有组件)                                            // //.paint()方法,自动调用    }} 


[解决办法]
顶下。
[解决办法]
雄起!!!!!
[解决办法]
同学们,SWT和AWT不是一个东西!!!
[解决办法]
看到标题是SWT,里面却在讨论AWT,提醒一下而已。
SWT也不是什么插件,SWT和和Designer也是不一样的,不懂AWT,不能回答你的问题

热点排行