【问题标题】:unable to call repaint from inner class无法从内部类调用重绘
【发布时间】:2014-08-05 09:36:19
【问题描述】:

我有一个扩展 JPanel 的外部类并拥有一个仅绘制图像的 paintComponent 方法,我的内部类也是一个 JPanel 并且是我的鼠标事件侦听器。这些事件通过在更改后调用重绘来改变绘图的外观,但似乎没有正确调用重绘

    public class FollowingEyes extends JPanel
{
    private Eye eye;
    private Eye eye2;
    private final int HEIGHT = 500;
    private final int WIDTH = 500;
    private OtherPanel panel;
    public FollowingEyes()
    {

        eye     =   new Eye((WIDTH/2)-50,50);
        eye2    =   new Eye((WIDTH/2)+50,50);     
        panel   =   new OtherPanel();
        setPreferredSize(new Dimension(500,500));
       addMouseListener(panel);
       addMouseMotionListener(panel);
    }

        public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        eye.draw(g);
        eye2.draw(g);              
    }



    private class OtherPanel extends JPanel implements MouseListener, MouseMotionListener
    { 



           @Override
        public void mouseEntered(MouseEvent e)
        {
            System.out.println("Mouse entered..");
            eye.look(true);
            eye2.look(true);
            repaint();

        }
        @Override
        public void mouseExited(MouseEvent e)
        {
            System.out.println("Mouse exited..");
            eye.look(false);
            eye2.look(false);
            repaint();
        }

        @Override
        public void mouseClicked(MouseEvent e){};
        @Override
        public void mousePressed(MouseEvent e){};
        @Override
        public void mouseReleased(MouseEvent e){};

        @Override
        public void mouseMoved(MouseEvent e)
        {
            eye.setAngle(e.getX(), e.getY());
            eye2.setAngle(e.getX(), e.getY());
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent e){};


    }

【问题讨论】:

    标签: java swing


    【解决方案1】:

    首先,eyes 字段是未使用的,因此是不必要的。另外,如果您想从OtherPanel 调用整个FollowingEyes 的重绘,请使用FollowingEyes.this.repaint()。您目前所拥有的只是重绘 OtherPanel

    【讨论】:

      【解决方案2】:

      问题是你的眼睛(eyeeye2)被添加到FollowingEyes 面板,但是当鼠标移动时,你在OtherPanel 上调用repaint(),因此眼睛不会被重新绘制。

      尝试调用FollowingEyes 实例的repaint()

      eyes.repaint();
      

      另外一个问题是OtherPaneleyes 属性是用一个新的FollowingEyes 实例而不是封闭实例来初始化的。您应该使用FollowingEyes.this 对其进行初始化或将其作为构造函数参数传递(这样您就可以将OtherPanel 类设为外部类)。

      【讨论】:

      • 谢谢,很抱歉造成眼睛领域的混乱 - 不应该在那里。
      猜你喜欢
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      相关资源
      最近更新 更多