2

java2d 形状の中心を JPanel の中心に合わせようとしましたが、うまくいきませんでした。getBounds メソッドを使用して、画像と平行四辺形のような多くの 2D 形状に対しては実行できましたが、ひし形では実行できませんでしたが、それらはすべて同じパターンに従います。劇的なことに、実際のプロジェクトから SSCCE を準備したとき、どれも正しく位置合わせできませんでした。中央に図形を描画するための drawShape メソッドを作成しました。どこが間違っているのかわかりませんでした。これは SSCCE です。

            import java.awt.*;
            import java.awt.geom.*;
            import java.util.*;
            import javax.swing.*;
            public class TestPanel extends JPanel{
                    Point a,b,c,d;
                    Shape trapezium,parallelogram;
                    Random random=new Random();
                    public TestPanel(){
                        a=new Point();
                        b=new Point();
                        c=new Point();
                        d=new Point();
                        rhombusFactory(a,b,c,d);
                        trapezium=getQuadrilateral(a,b,c,d);


                    }
                    private void rhombusFactory(Point a,Point b,Point c,Point d)
                    {       int width=random.nextInt(200-100)+100;
                            int height=random.nextInt(150-50)+50;
                            a.x=0;
                            a.y=0;
                            b.x=a.x+width/2;
                            b.y=a.y+height/2;
                            c.x=a.x+width;
                            c.y=a.y;
                            d.x=a.x+width/2;
                            d.y=a.y-height/2;
                    }
                    private void parallelogramFactory(Point a,Point b,Point c,Point d){
                        int l1=random.nextInt(200-100)+100;
                        int l2=random.nextInt(150-70)+70;
                        int offset=(random.nextInt(2)==0?-1:1)*(random.nextInt(50-20)+20);
                        a.x=0;
                        a.y=0;
                        b.x=a.x+l1;
                        b.y=a.y;
                        d.x=a.x+offset;
                        d.y=a.y+l2;
                        c.x=d.x+l1;
                        c.y=d.y;
                }
                     private Shape getQuadrilateral(Point a,Point b,Point c,Point d){
                         GeneralPath gp=new GeneralPath();
                         gp.moveTo(a.x,a.y);
                         gp.lineTo(b.x,b.y);
                         gp.lineTo(c.x,c.y);
                         gp.lineTo(d.x,d.y);
                         gp.closePath();
                         return gp;
                    }
                    private void drawShape(Graphics2D g,Shape shape){
                        AffineTransform oldt=g.getTransform();
                        Rectangle2D bounds=shape.getBounds2D();
                        double height=bounds.getHeight();
                        double width=bounds.getWidth();
                        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                        g.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
                        g.translate(this.getWidth()/2,this.getHeight()/2);
                        g.translate(-width/2,-height/2);
                        g.draw(shape.getBounds2D());
                        g.draw(shape);
                        g.setTransform(oldt);
                }
                    public void paintComponent(Graphics g2){
                            super.paintComponent(g2);
                            Graphics2D g=(Graphics2D)g2;
                            drawShape(g,trapezium);
                            //drawShape(g,parallelogram);
                    }
                    public static void main(String args[]){
                            JFrame jf=new JFrame();
                            TestPanel tp=new TestPanel();
                            jf.setLayout(new BorderLayout());
                            jf.add(tp,BorderLayout.CENTER);
                            jf.setSize(500,500);
                            jf.setVisible(true);
                    }
             }

編集:コードから紛らわしい行を削除しまし た...

4

3 に答える 3

1

編集:
methodrhombusFactory()で、次のように変更します。

a.y=0;

これに:

a.y=height/2;

簡単な説明:メソッドでは、形状の境界の左上隅が (Point: [(getWidth-width)/2, (getHeight()-height)/2]) であると想定される場所に、グラフィックス コンテキストの原点を配置します
drawShape(). rhombusFactory()メソッドでは、ポイントを (0, 0) に設定すると、aシェイプの左上隅が (0,-height/2) に移動し、垂直方向の中央に配置されなくなります。

于 2013-05-19T18:07:34.820 に答える
1

あなたの翻訳は間違っています。最初に描画スペースの原点をパネルの中心に変換してから、描画の中心を原点に変換する必要があります。あなたは後者を正しく行いましたが、最初は間違っていました。

変化する

g.translate(this.getWidth(),this.getHeight());
g.translate(-width/2,-height/2);

g.translate(this.getWidth()/2,this.getHeight()/2);
g.translate(-width/2,-height/2);

あるいは単に

g.translate((this.getWidth() - width) / 2,(this.getHeight() - height) / 2);
于 2013-05-19T18:08:23.640 に答える