0

複数のグラフィックスオブジェクトを1つに変換する方法は?(コードのこの部分はテトリスフィギュアを生成する必要があります。ここで、generate()はフィギュアを作成します)

public void paint(Graphics g){
        Figure f = generate();
        int length = f.getX()[0].length;
        for(int j =0; j<f.getX().length;j++){

            int xr=xs+10;
            ys = 0;                 
            for(int i=0;i<length;i++){                      

                if (f.getX()[j][i] == 1){
                    int yr = ys+10;
                    Rectangle p = new Rectangle(xs,ys,xr,yr);
                    g.setColor(f.getY());
                    g.drawRect(p.x, p.y, p.width, p.height);    
                    g.fillRect(p.x, p.y, p.width, p.height);    
                    //g.translate(xs+40, ys+40);
                }
                ys+=10;

            }
            xs+=10;
        }
        xs=0;
        ys=0;


       //g.setColor(Color.white);
       //g.drawRect(45, 95, 55, 105);

    }
4

2 に答える 2

1

一緒に移動/操作できるように、囲んでいるコンポーネントの中に複数のコンポーネントを配置しようとしていると仮定します。

1つの提案は、のように、各オブジェクトをパネルオブジェクトに追加することですJPanel

ただし、正確に何を達成しようとしているのかはやや不明確です。

于 2012-07-25T16:04:50.937 に答える
1

コードに問題があるので、Java2Dから始めていると思います。まず第一に、あなたは常にスーパークラスのペイントバージョンを呼び出す必要があります。コンポーネントはそれ自体を適切にレンダリングする機会を持っている必要があるため、これを行う必要があります。見てください。

@Override
public void paint( Graphics g ) {

    // you MUST do this
    super.paint(g);

    // continue here... 

}

JFrameを扱っている場合は、paintメソッドをオーバーライドします。JPanelなどのJComponentの子を使用している場合は、paintの同じシグネチャを持つpaintComponentメソッドをオーバーライドする必要がありますが、パブリックではなく保護されています。paintをオーバーライドすることもできますが、これらの場合(JComponentとその子)、paintはペイント作業を3つのメソッド(paintComponent、paintBorder、およびpaintChildren)に委任するメソッドであるため、paintComponentをオーバーライドするのが最適なオプションです。

別の詳細。グラフィックを操作する最良の方法は、現在のグラフィックコンテキストに基づいて新しいグラフィックコンテキストを作成し、使用後に破棄することです。見てください:

@Override
public void paint( Graphics g ) {

    // you MUST do this
    super.paint(g);

    Graphics newG = g.create();
    // or Graphics2D newG2d = (Graphics2D) g.create();

    // do your work here...

    newG.dispose(); // disposes the graphics context

}

createメソッドを使用して作成されたグラフィックスコンテキストは、現在のグラフィックスコンテキスト(同じ状態)のコピーですが、変更しても元のグラフィックスコンテキストには影響しないため、これを行うと、元のグラフィックスの状態を混乱させることはありません。コンテクスト。

最後に、グラフィックスコンテキストを受け取る描画メソッドをフィギュアに含める必要があると思います。したがって、Figureインスタンスはそれ自体を描画する責任があります。何かのようなもの:

public class Figure {

    // figure's members...

    public void drawMe( Graphics2D g2d ) {
        // do the draw work here...
    }

}

public class MyFrame extends JFrame {

    @Override
    public void paint( Graphics g ) {

        super.paint(g);

        Graphics2D g2d = (Graphics2D) g.create();

        // let's suppose that figureList is a List<Figure> or a Figure[]
        for ( Figure f : figureList ) {
            f.drawMe( g2d );
        }

        g2d.dispose();

    }

}

もちろん、描画メソッドが平行移動や回転のようにグラフィックスコンテキストを「深く」変更しすぎる場合は、各フィギュアに新しいグラフィックスコンテキストを作成できます。新しいものを使用した後、それらを処分する必要があります。

于 2012-07-25T16:21:18.717 に答える