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