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将被再次调用并绘制该方法告诉它的任何内容。

所以要解决你的问题:

List1)在你的类内部创建一个扩展JPanelJComponent除非出于某种原因)。

2)制作一种public方法以允许添加到列表(并在需要时删除)。

3)在paintComponent遍历List并绘制每个对象。

这是一个示例(用鼠标单击容器上的任意位置以绘制 a 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 回答