首先,我重绘了两个jpanel,分为A和B,然后把B添加的A中。
A中paint了一个静态图片作为背景;
B中初始化时paint的是一张静态图片,这个时候没有无限repaint;
当我通过鼠标事件把B中的图片设置成一张动态图后,我都没有对B进行repaint,A和B各自就开始调用repaint,无限循环,这是为什么?
还有当通过鼠标事件把B中的图片重新设置成静态图片后,A和B还是在无限调用repaint,这就让我更糊涂了。
希望各位前辈帮帮忙,谢谢!

解决方案 »

  1.   

    第一个JPanel
    public class HallJPanel extends JPanel implements MouseListener
    {
    public Image imgBg, dynamicImg, imgTable[];
    public TableJPanel tjp[]; private int wid = 0;
    private int hei = 0; private int x = 0;
    private int y = 0;
    private int w = 0;
    private int h = 0; private Graphics2D g2d; public HallJPanel()
    {
    this.initImages(); this.initTable();

    this.addML();
    } // initialize the images
    public void initImages()
    {
    try
    {
    imgBg = ImageIO.read(new File("images\\background\\hallCarpet.png")); imgTable = new Image[10];
    for (int i = 0; i < imgTable.length; i++)
    {
    imgTable[i] = ImageIO.read(new File("images\\table\\table-" + (i + 1) + ".png"));
    } } catch (Exception e)
    {
    e.printStackTrace();
    } // Attention : process the dynamic image with Toolkit , not ImageIO.read
    dynamicImg = Toolkit.getDefaultToolkit().createImage("images\\table\\table-1.gif");
    } // add mouseListener
    public void addML()
    {
    this.addMouseListener(new MouseAdapter()
    {
    @Override
    public void mousePressed(MouseEvent e)
    { if (tjp[0].pressed)
    {
    tjp[0].pressed = false;
    tjp[0].xGap = 0;
    tjp[0].yGap = 0;
    // 重新设置为静态图
    tjp[0].setImg(imgTable[0]);
    tjp[0].repaint();
    } }
    });
    }
    public void initTable()
    {
    this.setLayout(null);
    tjp = new TableJPanel[1];
    tjp[0] = new TableJPanel(imgTable[0]);
    tjp[0].addMouseListener(this);
    tjp[0].setBounds(100, 100, 100, 100);
    this.add(tjp[0]); } public void paintComponent(Graphics g)
    {
    super.paintComponent(g); wid = getWidth();
    hei = getHeight(); g2d = (Graphics2D) g.create();
                    // 设置成动图后,这句话会无限打印
    System.out.println(getWidth());
    g2d.drawImage(imgBg, 0, 0, wid, hei, this); g2d.dispose();
    } @Override
    public void mouseClicked(MouseEvent e)
    {
    } @Override
    public void mousePressed(MouseEvent e)
    {
    if (e.getSource() == tjp[0])
    {
    // 设置动图
    tjp[0].setImg(dynamicImg);
    }
    } @Override
    public void mouseReleased(MouseEvent e)
    {
    } @Override
    public void mouseEntered(MouseEvent e)
    {
    }
    }第二个JPanel
    public class TableJPanel extends JPanel
    {
    public Image img; public int xGap = 0;
    public int yGap = 0; public boolean pressed = false; private MouseAdapter ma;

    private Graphics2D g2d; public TableJPanel(Image img)
    {
    this.img = img;
    this.setCursor(Cursors.hand);
    this.setOpaque(false);
    this.initMouseAdapter();
    this.addMouseListener(ma);
    } // initialize the MouseAdapter
    public void initMouseAdapter()
    {
    ma = new MouseAdapter()
    {
    @Override
    public void mouseEntered(MouseEvent e)
    {
    if (!pressed)
    {
    xGap = 2;
    yGap = 1;
    repaint();
    }
    } @Override
    public void mouseExited(MouseEvent e)
    {
    if (!pressed)
    {
    xGap = 0;
    yGap = 0;
    repaint();
    }
    } @Override
    public void mousePressed(MouseEvent e)
    {
    pressed = true;
    xGap = 5;
    yGap = 3;
    repaint();
    }
    };
    } public void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    g2d = (Graphics2D) g.create();
    // 设置动图后 , 这句话一直打印
    System.out.println(getWidth());
    g2d.drawImage(img, xGap, yGap, getWidth() - (2 * xGap), getHeight() - (2 * yGap), this);
    g2d.dispose();
    } // 设置图片
    public void setImg(Image img)
    {
    this.img = img;
    }
    }