2

私は基本的に長方形のマトリックスを持っていて、それらを別々に描きたいのですが、描かれたそれぞれが前の長方形を削除し、最後の孤独な長方形になってしまいます。そして、私は何時間もグーグルして検索していて、見つけた唯一のアドバイスは一度にそれを描くことでした。それを試しましたが、それぞれ別々のコンポーネントを持つことを中心に構築されたリスナーを完全に台無しにしているようです。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Color;
import javax.swing.JComponent;


@SuppressWarnings("serial")
public class GraphicEdge extends JComponent
{

    public Rectangle box;
    private Edge edge;
    /**
     * Creates a graphical box corresponding to the given edge at the given 
     * position
     * @param x x coordinate 
     * @param y y coordinate
     * @param e edge represented
     */
    public GraphicEdge(int x, int y, int width, int length, Edge e)
    {
        this.edge = e;
        this.box = new Rectangle(x, y, width, length);
    }
    /**
     * Paints said edge. Will be recalled whenever the edge switches from 
     * active to inactive.
     * @param g graphics.
     */

    public void paintComponent(Graphics g)
    {

        Graphics2D g2 = (Graphics2D)g;

        if (this.edge.getActive()==0)
        {
            g2.setColor(Color.red);
        }
        else
        {
            g2.setColor(Color.green);
        }
        g2.fill(this.box);
        g2.draw(this.box);

    }
    /**
     * Calls for the redrawing of the component.
     */
    public void redrawComponent()
    {
        repaint();
    }

    /**
     * Gets edge.
     */
    public Edge getEdge()
    {
        return this.edge;
    }
    /**
     * Returns the edge's rectangle.
     * @return
     */
    public Rectangle getBox()
    {
        return this.box;
    }
}
4

1 に答える 1

2

paintComponent私が正しく理解していれば、あなたは基本的にあなたの絵を永続的にしたいと思いますか?

デフォルトでは、で行われるすべての描画paintComponentは永続的ではありません。

したがって、onrepaint() paintComponentが再度呼び出され、メソッドが指示するものは何でも描画します。

だからあなたの問題を解決するには:

1)List拡張するクラス内を作成しますJPanelJComponent理由がない限り)。

2)publicリストへの追加(および必要に応じて削除)を許可するメソッドを作成します。

3)paintComponentを繰り返して、List各オブジェクトを描画します。

次に例を示します(コンテナ上の任意の場所でマウスをクリックして描画しますRectangle)。

ここに画像の説明を入力してください

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

public class Test {

    private final JFrame frame = new JFrame();
    private final MyPanel panel = new MyPanel();

    private void createAndShowUI() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test().createAndShowUI();
            }
        });
    }
}

class MyPanel extends JPanel {

    private List<Rectangle> recs = new ArrayList<>();

    public MyPanel() {
        initComponents();
    }

    private void initComponents() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);
                addRec(new Rectangle(me.getPoint().x, me.getPoint().y, 100, 50));
                repaint();
            }
        });
    }

    public void addRec(Rectangle rec) {
        recs.add(rec);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        for (Rectangle rec : recs) {
            g2d.drawRect(rec.x, rec.y, rec.width, rec.height);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }
}

注意@HFOEが言ったように、ペイントチェーンを尊重するためsuper.paintComponent(g)にオーバーライドされた最初の呼び出しとして呼び出すことを忘れないでください。そうしないと、視覚的な異常が発生する可能性があります。paintComponent

于 2013-01-13T17:06:13.470 に答える