2016-09-24 5 views
1

インタフェースjava.awt.geom.Shapeの実装を作成しました。これには、ANDゲートの形状を描画するPathIteratorの観点からの一連のパスが含まれます。 これでマウスポインタを動かすときにこの図形を動かしたいと思います。これは優れた動作しますが、私は線の太さを増やしたいとき、これは動作を停止します。私はペンの厚さを変えないとうまくいきます。 ペンの幅を1に設定すると機能します。しかし、私が10に設定すると、ゲートの一部だけがポイント(0,0)から引っ張られて、変換されても影響を受けません。ここ は、ゲート・ソースです:太い線で変換できない

package pashe; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.PathIterator; 
import java.awt.geom.Point2D; 

import java.awt.geom.Rectangle2D; 

public class Gate implements Shape { 

    GPathIterator pathIterator; 
    public Gate(){ 

     pathIterator = new GPathIterator(); 
    } 
    @Override 
    public boolean contains(Point2D arg0) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean contains(Rectangle2D arg0) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean contains(double arg0, double arg1) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean contains(double arg0, double arg1, double arg2, double arg3) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public Rectangle getBounds() { 
     // TODO Auto-generated method stub 
     return new Rectangle(0,0,50,30); 
    } 

    @Override 
    public Rectangle2D getBounds2D() { 
     // TODO Auto-generated method stub 
     return (new Rectangle(0,0,50,30)); 
    } 

    @Override 
    public PathIterator getPathIterator(AffineTransform arg0) { 
    return pathIterator; 

    } 

    @Override 
    public PathIterator getPathIterator(AffineTransform arg0, double arg1) { 
     // TODO Auto-generated method stub 
     return pathIterator; 
    } 

    @Override 
    public boolean intersects(Rectangle2D arg0) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean intersects(double arg0, double arg1, double arg2, double arg3) { 
     // TODO Auto-generated method stub 
     return false; 
    } 


} 

package pashe; 

import java.awt.geom.PathIterator; 

public class GPathIterator implements PathIterator { 

    int current = 0; 
    @Override 
    public int currentSegment(float[] points) { 
     switch (current){ 
     case 0:{ 
      points[0] = 0; 
      points[1] = 0; 
      return PathIterator.SEG_MOVETO; 
     } 
     case 1: 
     { 
      points[0] = 15; 
      points[1] = 0; 
      return PathIterator.SEG_LINETO; 
     } 
     case 2: 
     { 
      points[0] = 40; 
      points[1] = 0; 
      points[2] = 40; 
      points[3] = 15; 
      return PathIterator.SEG_QUADTO; 
     } 
     case 3: 
     { 
      points[0] = 40; 
      points[1] = 30; 
      points[2] = 15; 
      points[3] = 30; 
      return PathIterator.SEG_QUADTO; 
     } 
     case 4: 
     { 
      points[0] = 0; 
      points[1] = 30; 
      return PathIterator.SEG_LINETO; 
     } 
     case 5: 
     { 
      return PathIterator.SEG_CLOSE; 
     } 


     default: 
      return -1; 
     } 

    } 

    @Override 
    public int currentSegment(double[] arg0) { 
     // TODO Auto-generated method stub 
     return current; 
    } 

    @Override 
    public int getWindingRule() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public boolean isDone() { 
     // TODO Auto-generated method stub 
     if (current < 6) 
     return false; 
     return true; 
    } 

    @Override 
    public void next() { 
     // TODO Auto-generated method stub 
     current++; 
    } 

} 

package pashe; 

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.Stroke; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.GeneralPath; 
import java.awt.geom.Point2D; 
import java.awt.geom.QuadCurve2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.geom.Ellipse2D; 

public class Prob extends JFrame { 

    private JPanel contentPane; 
    Adap adap; 
    BasicStroke stroke; 
    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Prob frame = new Prob(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public Prob() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseMoved(MouseEvent e) { 
       adap.mouseMoved(e); 
      } 
     }); 

     //System.out.println(stroke.getLineWidth()); 
     adap = new Adap(this); 
     contentPane.addMouseListener(adap); 
     contentPane.setBorder(new EmptyBorder(0, 0, 0, 0)); 
     setContentPane(contentPane); 
    } 
    public void paint(Graphics g){ 
     Graphics2D g2d = (Graphics2D)g; 
     /*super.paint(g); 
     if (adap.evt != null){ 
     int x = adap.evt.getX(); 
     int y = adap.evt.getY(); 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.setStroke(new BasicStroke(5)); 
     GeneralPath gp = new GeneralPath(); 
     gp.moveTo(x, y); 
     gp.lineTo(x + 15 , y); 
     gp.quadTo(x + 40, y , x + 40, y + 15); 
     gp.quadTo(x + 40, y + 30, x + 15, y + 30); 
     gp.lineTo(x, y+30); 
     gp.closePath(); 
     g2d.draw(gp); 
     gp.moveTo(x - 8, y + 5); 
     gp.lineTo(x, y + 5); 
     gp.moveTo(x - 8, y + 25); 
     gp.lineTo(x, y + 25); 
     g2d.draw(gp); 
     gp.moveTo(x + 40, y + 15); 
     gp.lineTo(x + 48, y + 15); 
     g2d.draw(gp); 
     }*/ 
     //g2d.setStroke(new BasicStroke(3)); 
     BasicStroke old = (BasicStroke)g2d.getStroke(); 
       stroke = new BasicStroke(10f,old.getEndCap(),old.getLineJoin(),old.getMiterLimit(),old.get DashArray(),old.getDashPhase()); 

       if (adap.evt == null) 
     { 

      return; 
     } 
     super.paint(g); 
     int x = adap.evt.getX(); 
     int y = adap.evt.getY(); 
        System.out.println("x=" + x + " y=" + y); 
     Shape shape = new Gate(); 
     AffineTransform trans = AffineTransform.getTranslateInstance(x,y); 

     //Shape shape = trans.createTransformedShape(gate); 
     //shape = stroke.createStrokedShape(shape); 
       //g2d.fill(shape); 
     //Shape shape = trans.createTransformedShape(gate); 
     //g2d.setTransform(trans); 
       //shape = new Ellipse2D.Double(0,0,18,18); 
     g2d.setStroke(stroke); 
     g2d.transform(trans); 
       //shape = trans.createTransformedShape(shape); 
     g2d.draw(shape); 
       g2d.setStroke(old); 
    } 

    class Adap extends MouseAdapter { 
     Prob prob; 
     MouseEvent evt; 
     public Adap(Prob p){ 
      prob = p; 
     } 
     @Override 
     public void mouseEntered(MouseEvent ev) { 
      evt = ev; 
      prob.repaint(); 
     } 
     public void mouseMoved(MouseEvent ev) { 
      evt = ev; 
      prob.repaint(); 
     } 


    } 
    } 
+1

より良いヘルプを早く得るには、[MCVE]または[短い、自己完結型、正しい例](http://www.sscce.org/)を投稿してください。クラスを1つのソースに結合する前にまず行うべきことは、20行ほどのコメント付きコードを削除することです! –

+1

BTW - 'JFrame'の' paint(Graphics) 'より' JPanel'の 'paintComponent(Graphics)'をオーバーライドするほうがいいです。 –

答えて

0

次を使用します - 詳細はのGraphics2Dをお読みください。

g2d.setStroke(stroke); 
    g2d.transform(trans); 
    Shape shape2 = stroke.createStrokedShape(shape); 
    g2d.draw(shape2); 

良い仕事!

関連する問題