<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    FORTUNE

    THE WAY TO THE MASTER...
    posts - 49, comments - 18, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    一個小SWT程序

    Posted on 2006-02-22 13:13 fortune 閱讀(883) 評論(0)  編輯  收藏 所屬分類: 我的學(xué)習(xí)筆記

    以下程序運行后產(chǎn)生一個紅色的小球在窗口來回彈,如在小球結(jié)束運動之前關(guān)閉窗口(shell)則產(chǎn)生:

    Exception in thread "main" org.eclipse.swt.SWTException: Widget is disposed
     at org.eclipse.swt.SWT.error(SWT.java:2942)
     at org.eclipse.swt.SWT.error(SWT.java:2865)
     at org.eclipse.swt.SWT.error(SWT.java:2836)
     at org.eclipse.swt.widgets.Widget.error(Widget.java:395)
     at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:297)
     at org.eclipse.swt.widgets.Control.internal_new_GC(Control.java:1104)
     at org.eclipse.swt.graphics.GC.<init>(GC.java:132)
     at org.eclipse.swt.graphics.GC.<init>(GC.java:99)
     at ballThread.clean(BounceBall.java:115)
     at ballThread$2.run(BounceBall.java:135)
     at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
     at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
     at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3057)
     at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2716)
     at org.eclipse.swt.widgets.Display.release(Display.java:2765)
     at org.eclipse.swt.graphics.Device.dispose(Device.java:261)
     at BounceBall.main(BounceBall.java:58)

    原因應(yīng)該是仍然在使用對象時將該對象清除了導(dǎo)致異常的產(chǎn)生,應(yīng)該怎樣改動程序呢??思考中.........


    import org.eclipse.swt.graphics.GC;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Canvas;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.graphics.Color;

    public class BounceBall {

     private Shell sShell = null;  //  @jve:decl-index=0:visual-constraint="10,10"
     private Canvas canvas = null;
     private Button startButton = null;
     ballThread bt = null;
     Display display = null;

     public BounceBall() {
      super();
      // TODO Auto-generated constructor stub
    //  bt = new ballThread(canvas);
      display = Display.getDefault();
     }

     /**
      * This method initializes canvas 
      *
      */
     private void createCanvas() {
      canvas = new Canvas(sShell, SWT.NONE);
      canvas.setBackground(new Color(Display.getCurrent(), 0, 0, 255));
      canvas.setBounds(new org.eclipse.swt.graphics.Rectangle(26,14,527,242));
     }

     /**
      * @param args
      */
     public static void main(String[] args) {
      // TODO Auto-generated method stub
      /* Before this is run, be sure to set up the launch configuration (Arguments->VM Arguments)
       * for the correct SWT library path in order to run with the SWT dlls.
       * The dlls are located in the SWT plugin jar. 
       * For example, on Windows the Eclipse SWT 3.1 plugin jar is:
       *       installation_directory\plugins\org.eclipse.swt.win32_3.1.0.jar
       */
    //  Display display = Display.getDefault();
      
      BounceBall thisClass = new BounceBall();
      thisClass.createSShell();
      thisClass.sShell.open();

      while (!thisClass.sShell.isDisposed()) {
       if (!thisClass.display.readAndDispatch())
        thisClass.display.sleep();
      }
      thisClass.display.dispose();
     }

     /**
      * This method initializes sShell
      */
     private void createSShell() {
      sShell = new Shell();
      sShell.setText("Shell");
      createCanvas();
      sShell.setSize(new org.eclipse.swt.graphics.Point(588,367));
      startButton = new Button(sShell, SWT.NONE);
      startButton.setBounds(new org.eclipse.swt.graphics.Rectangle(87,284,76,33));
      startButton.setText("Start");
      startButton.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
       public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
        //System.out.println("widgetSelected()"); // TODO Auto-generated Event stub widgetSelected()
        new ballThread(40,40,canvas).start();
        
       }
      });
     }

    }


     class ballThread extends Thread {

      int x, y, xsize, ysize, addx, addy;
      Rectangle rc = null;
      GC gc = null;
      Canvas c = null;
      Color red = Display.getCurrent().getSystemColor(SWT.COLOR_RED);

      public ballThread(int x,int y,Canvas ca) {
       c = ca;
       this.x = x;
       this.y = y;
       xsize = 10;
       ysize = 10;
       addx = 1;
       addy = 2;
       rc = c.getBounds();
       
      }
      
      
      public void draw(int x, int y, int xsize, int ysize) {
       
       gc = new GC(c);
       gc.drawOval(x, y, xsize, ysize);
       gc.setBackground(red);
       gc.fillOval(x, y, xsize, ysize);
       gc.dispose();
      }

      public void clean() {
       gc = new GC(c);
       // Rectangle rt = canvas.getBounds();
       gc.drawRectangle(rc.x - 100, rc.y - 100, rc.width + 100,
         rc.height + 100);
       gc.fillRectangle(rc.x - 100, rc.y - 100, rc.width + 100,
         rc.height + 100);
       gc.dispose();
      }

      public void run() {
       for (int i = 1; i < 1500; i++) {
        try{
         
        Display.getDefault().asyncExec(new Thread () {
        public void run(){
        draw(x, y, xsize, ysize);}});
         Thread.sleep(10);
        
        Display.getDefault().asyncExec(new Thread () {
        public void run(){ 
        clean();}});
        } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
        

        if (rc.contains(x, y)) {
         x += addx;
         y += addy;
        } else {
         

         if (x >= rc.width || x <= 26) {
          addx = -addx;

          x += addx;
          y += addy;
         } else if (y >= rc.height || y <= 14) {
          addy = -addy;

          x += addx;
          y += addy;
         }

        }

       }
      }

     }

    想到一個辦法能夠去除那些exceptions,就是在display.dispose()前加一句Thread.currentThread().stop();強制終止線程,不過這個辦法肯定是最垃圾的辦法.......

    主站蜘蛛池模板: 国产成+人+综合+亚洲专| 亚洲AV区无码字幕中文色| 亚洲精品伦理熟女国产一区二区| 亚洲视频免费一区| 亚洲国产精品乱码在线观看97 | 亚洲香蕉网久久综合影视| 最好2018中文免费视频| 亚洲日本韩国在线| 你是我的城池营垒免费观看完整版| 亚洲精品一品区二品区三品区| 中文无码成人免费视频在线观看| 人人狠狠综合久久亚洲婷婷| 无码国产精品一区二区免费模式| 亚洲一级二级三级不卡| 99久久久精品免费观看国产| 日韩亚洲人成在线| 国产zzjjzzjj视频全免费| 五月天国产成人AV免费观看| 亚洲国产精品成人久久| 中文字幕免费在线| 欧洲 亚洲 国产图片综合| 国产成人精品免费视频大全五级| h在线看免费视频网站男男| 中文字幕精品无码亚洲字| 色猫咪免费人成网站在线观看| 亚洲AV无码专区在线亚| 亚洲国产成人久久笫一页| 国产午夜不卡AV免费| 亚洲AV色吊丝无码| 亚洲美女在线国产| 69国产精品视频免费| 亚洲av成人一区二区三区观看在线| 亚洲性日韩精品一区二区三区| 最新黄色免费网站| 色吊丝性永久免费看码| 亚洲黄色三级视频| 国产一级大片免费看| 无码国产精品一区二区免费式芒果 | 亚洲最大无码中文字幕| 国产黄色一级毛片亚洲黄片大全| 最近中文字幕大全中文字幕免费|