0

Java でデモ ペイント アプリケーションを実装しています。私は今、単一の形を描くことができます。もう一度描こうとすると、前の形が消えて新しい形が出てきます。BorderLayut.CENTER で内部フレームに JPanel を埋め込んでいます。

この内部フレームに複数の図形を描画する方法を教えてください。

    public class InternalFrame extends JInternalFrame{

    public InternalFrame(String string, boolean b, boolean c, boolean d,
            boolean e) {
        super(string,b,c,d);

        MyShape myShape2 = new MyRectangle();
        add(myShape2, BorderLayout.NORTH);

        MyShape myShape1 = new MyCircle();
        add(myShape1, BorderLayout.SOUTH);      
}   
}

public class MyRectangle extends MyShape {


    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    int temp = 0;

System.out.println("rect");
    // draw circle
    g.setColor(Color.RED);
    g.fillRect(startX, startY, endX - startX, endY - startY);
    g.setColor(Color.GREEN);
    g.drawRect(startX, startY, endX - startX, endY - startY);

}


}


public abstract class MyShape extends JPanel {

    protected int startX;
    protected int startY;
    protected int endX;
    protected int endY;

    MyShape(){
        addMouseListener(new MouseAdapter() {

            public void mousePressed(MouseEvent event) {

//              To initialisise the starting and ending point 
                setStart(0,0);
                setEnd(0,0);
//              To set starting point
                setStart(event.getX(), event.getY());
            }

            // handle mouse release event
            public void mouseReleased(MouseEvent event) {
                setEnd(event.getX(),event.getY());

            }

        });
    }

    public void setStart(int x, int y) {

        startX = x;
        startY = y;

        repaint();
    }

    public void setEnd(int x, int y){

        endX = x;
        endY = y;
        repaint();
    }




}
4

2 に答える 2

1

カスタム ペインティング アプローチでは、これを行う 2 つの一般的な方法を示します。使用するアプローチは、正確な要件によって異なります。

編集:

たぶん、Playing With Shapesには、あなたを助けるためのより多くの情報/アイデアがあります。

于 2013-09-20T22:00:12.160 に答える
1

Swing での描画は破壊的です。つまり、paintComponent呼び出されるたびに、コンポーネントの状態全体を最初から再描画する必要があります。

最善の解決策は、必要に応じて呼び出す/描画する/塗りつぶすことができる s またはペイント コマンドを生成することです ListShapepaintComponent

詳細とアイデアについては、Swing のインクリメンタル グラフィックスを参照してください。

于 2013-09-20T21:56:09.597 に答える