0

必要なときにもう一度あなたのところに行きます。へへへ 線、円、四角形、三角形を作るちょっとした SWT をやったことがあります。これを行うには、始点と終点を取り、これらすべての図を描きます。描画したら、x 軸と y 軸に移動したいと思います。私が困っているところの核心をここに置きます。キャンバス内にマウスリスナーを配置し、クリックして離すと音を聞いて線を作成します。//これはリスナーです

MasX.addListener(SWT.Selection, new Listener(){

        public void handleEvent(Event event) {
            SX += 1;
            EX += 1;
            canvas.redraw();
            //gc.drawLine(SX, SY, EX, EY);
            //crearLinea(SX,SY,EX,EY,gc);

        }

    });

//これが線画のメソッド

public void crearLinea(int SX, int SY, int EX, int EY, GC gc){

    int x1 = SX;
    int x2 = EX;
    int y1 = SY;
    int y2 = EY;
    System.out.println(SX+" "+SY+" "+EX+" "+EY);
    int cont = 0;
    float dx, dy, m, y, x;
    if (x1>x2){
        int ax = x2;
        int ay = y2;
        x2 = x1;
        x1 = ax;
        y2 = y1;
        y1 = ay;
    }
    dx = x2 - x1;
    dy = y2 - y1;
    m = dy/dx;
    if (m>=-1&&m<=1){
        y = y1;
        //System.out.println(m+" "+x1+" "+y1+"....."+x2+" "+y2);
        for (x = x1 ; x <= x2;x=x+5){
            //if (x>=dot&&x<=dot+10||x>=dot*2&&x<=dot*2+10||x>=dot*3&&x<=dot*3+10){
                gc.drawLine((int)x, (int)Math.round(y), (int)x, (int)Math.round(y));
                y+=m*5;
            //}
        }   
    }
    if(m>1){
        x = x1;
        //System.out.println(m+" "+x1+" "+y1+"....."+x2+" "+y2);
        for (y = y1 ; y <= y2;y=y+3){
            if (cont<=5){
            //System.out.println(cont);
            gc.drawLine((int)Math.round(x), (int)y, (int)Math.round(x), (int)y);
            cont++;
            }
            if(cont>=10){
            //System.out.println(cont);
            cont=0;
            }
            if(cont>5){
            //System.out.println(cont);
            cont++;
            }
            x+=(1/m)*3; 
        }
    }
    if(m<-1){
        x = x1;
        //System.out.println(m+" "+x1+" "+y1+"....."+x2+" "+y2);
        for (y = y1 ; y >= y2;y--){
            if(y%10==0||y%8==0||y%12==0){
            gc.drawLine((int)Math.round(x), (int)y, (int)Math.round(x), (int)y);
            }
            x-=(1/m);   
        }
    }

}

それが私に与えるエラーはヌルポインター例外であり、gc.drawline() を指しています

誰かが私を助けてくれることを願っています:D

4

2 に答える 2

1

はイベントに対してEvent.gcのみ設定され、使用しているリスナーの場合は になります。SWT.PaintSWT.Selectionnull

選択リスナーのメソッドの 1 つを呼び出しControl.redrawて、コントロールの一部またはすべてを再描画するように要求できます。これにより、ペイント イベントが生成されます。

于 2013-10-15T08:57:17.887 に答える
0

Greg が教えてくれたように、canvas.addPaintListener(); を呼び出すメソッド canvas.redraw() を使用しました。メソッドは、必要な図面を作成するために探しているイベントを提供します。ボタンから呼び出すコードは次のとおりです。

MasX.addListener(SWT.Selection, new Listener(){

        public void handleEvent(Event event) {
            SX += 10;
            EX += 10;
            System.out.println(SX+" "+SY+" "+EX+" "+EY);
            canvas.redraw();
            System.out.println("Aqui 2");
            //gc.drawLine(SX, SY, EX, EY);
            //crearLinea(SX,SY,EX,EY,gc);

        }

    });

そして、線を正方形にする他のすべてのメソッドを呼び出すコア。

canvas.addPaintListener(new PaintListener() {

        @Override
        public void paintControl(PaintEvent event) {
            if(btnLinea.getSelection()){
                gc = event.gc;

                crearLinea(SX,SY,EX,EY,gc);

            }
            if(btnCirculo.getSelection()){
                gc = event.gc;

                crearCirculo(SX,SY,EX,EY,gc);

            }
            if(btnCuadrado.getSelection()){
                gc = event.gc;

                crearCuadro(SX,SY,EX,EY,gc);

            }
            if(btnTriangulo.getSelection()){
                gc = event.gc;

                crearTriangulo(SX,SY,EX,EY,gc);

            }
        }
    });

それが誰かに役立つことを願っています:D

于 2013-10-18T01:56:48.503 に答える