paintComponent()无法正确绘制矩形

时间:2020-07-01 06:53:33

标签: java swing awt paintcomponent repaint

我在JPanel中有一个自定义矩形的绘制网格。我在矩形列表中存储了矩形。我在JPanel中添加了MouseMotionListener和MouseListener;这两个组件都会听取用户的单击或单击并按住的信息,找出鼠标十字线的位置,遍历我的矩形列表并相应地更新其枚举值。然后,我调用repaint()在JPanel上的列表中重画矩形。唯一的问题是,在重新绘制列表时,不仅绘制了一个矩形,还绘制了整个列。请帮忙。

enter image description here

我对初始矩形列表的初始化

for(int i = 0; i < 10; i++)
        {
            for(int j = 0; i < 10; i++)
            {
                initList.add(new PathRectangle(i*49, j*49, 49, 49));
            }
        }
        
        mainPanel = new MainPanel(10, 10, initList);
        mainFrame.add(mainPanel);

我的矩形班

import  java.awt.*;

public class PathRectangle extends Rectangle
{

    private recType recVal = recType.UNDECLARED;

    //double pythHeurVal, manhattanHeurVal;

    public PathRectangle(int x, int y, int width, int height)
    {
        super(x, y, width, height);
    }

    public enum recType{WALL, STARTNODE, ENDNODE, UNDECLARED}

    public recType getRecVal() {
        return this.recVal;
    }

    public void setRecVal(recType wall) {
        this.recVal = wall;
    }


}

添加鼠标动作监听器

addMouseMotionListener(new MouseAdapter()
        {
            @Override
            public void mouseDragged(MouseEvent e) 
            {
                   //System.out.println(e.getPoint());
                    for(int i = 0; i < paintedRectangles.size(); i++)
                    {
                        if(paintedRectangles.get(i).contains(e.getPoint()))
                        {
                            //This will have to change in the future just testing it right now
                            paintedRectangles.get(i).setRecVal(PathRectangle.recType.WALL);
                            
                            
                            repaint();
                        }
                    }
            }
        });

添加MouseListener

addMouseListener(new MouseAdapter()
        {
           
            @Override
            public void mousePressed(MouseEvent e) {
                
                for(int i = 0; i < paintedRectangles.size(); i++)
                    {
                        if(paintedRectangles.get(i).contains(e.getPoint()))
                        {
                            //This will have to change in the future just testing it right now
                            paintedRectangles.get(i).setRecVal(PathRectangle.recType.WALL);
                            
                            
                            repaint();
                        }
                    }
            }
        });

paintComponent方法

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

        Graphics2D g2D = (Graphics2D) g;

        for(int i = 0; i < rows; i++)
        {
            for(int j = 0; j < cols; j++)
            {
                
                switch(paintedRectangles.get(i).getRecVal())
                {
                    case UNDECLARED:
                    g2D.drawRect(i*rectLenWidSize, j*rectLenWidSize, rectLenWidSize, rectLenWidSize);
                    break;

                    case WALL:
                    g2D.setColor(Color.BLACK);
                    g2D.fillRect(i*rectLenWidSize, j * rectLenWidSize, rectLenWidSize, rectLenWidSize);
                    break;

                    case STARTNODE:
                    g2D.setColor(Color.GREEN);
                    g2D.fillRect(i*rectLenWidSize, j*rectLenWidSize, rectLenWidSize, rectLenWidSize);
                    break;

                    case ENDNODE:
                    g2D.setColor(Color.RED);
                    g2D.fillRect(i*rectLenWidSize, j*rectLenWidSize, rectLenWidSize, rectLenWidSize);
                    break;
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

要执行类似的操作,您将需要二维ArrayList。一维ArrayList无法正确表示网格。

我还注意到在进行第一个初始化ArrayList时犯了一些错误

我的矩形列表初始化的初始化

for(int i = 0; i < 10; i++)
        {
            ArrayList<PathRectangle> initColList = new ArrayList<PathRectangle>();

            for(int j = 0; j < 10; j++)
            {
                initColList.add(new PathRectangle(i*49, j*49, 49, 49));
            }

            initList.add(initColList);
        }

paintComponent方法

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    
    Graphics2D g2D = (Graphics2D) g;

    for(int i = 0; i < paintedRectangles.size(); i++)
    {
        for(int j = 0; j < paintedRectangles.get(0).size(); j++)
        {
            
            //System.out.println(paintedRectangles.get(i).get(j).getRecVal());
            switch(paintedRectangles.get(i).get(j).getRecVal())
            {
                case UNDECLARED:
                g2D.drawRect(i*rectLenWidSize, j*rectLenWidSize, rectLenWidSize, rectLenWidSize);
                break;

                case WALL:
                g2D.setColor(Color.BLACK);
                g2D.fillRect(i*rectLenWidSize, j * rectLenWidSize, rectLenWidSize, rectLenWidSize);
                break;

                case STARTNODE:
                g2D.setColor(Color.GREEN);
                g2D.fillRect(i*rectLenWidSize, j*rectLenWidSize, rectLenWidSize, rectLenWidSize);
                break;

                case ENDNODE:
                g2D.setColor(Color.RED);
                g2D.fillRect(i*rectLenWidSize, j*rectLenWidSize, rectLenWidSize, rectLenWidSize);
                break;
            }
        }
    }
}