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