为什么在蛇游戏中没有调用绘制方法

时间:2014-06-20 10:03:19

标签: java swing actionlistener paintcomponent repaint

@SuppressWarnings("serial")
class GUI extends JPanel implements ActionListener
{

    public void paint(Graphics g)
    {
        super.paint(g);
        System.out.println("In here...");
        g.drawRect(frame.getWidth()/2,frame.getHeight()/2,(frame.getWidth()/2)+5,(frame.getHeight()/2+5));
        g.setColor(Color.BLACK);
        g.fillRect(frame.getWidth()/2,frame.getHeight()/2,(frame.getWidth()/2)+5,(frame.getHeight()/2+5));
    }

    @Override
    public void actionPerformed(ActionEvent ae) 
    {
        if(ae.getSource() == slow)
        {
            this.setMotionToSnake(slowMotion);  
            this.repaint();
        }

}
}

我在写一个蛇游戏程序。虽然没有调用那个paint方法。 解释代码: 我添加一个菜单栏到我的框架 在菜单栏开始是一个菜单,其中有3个子菜单,即慢,中,快。 每当我说慢的蛇的运动被决定,现在我应该能够在框架中看到一个矩形框(至少)。 这就是为什么我在那里调用重绘方法。

除了this.repaint()之外,我还使用了frame.repaint()/ just repaint()。 但是方法没有被调用。

感谢您提前帮助。

1 个答案:

答案 0 :(得分:1)

  

我正在使用流布局管理器frame.setLayout(new FlowLayout());

FlowLayout尊重添加到面板的所有组件的大小。您正在创建自定义组件,默认情况下,组件的大小为(0,0),因此无需绘制任何内容。

覆盖自定义组件的getPreferredSize()以返回组件的正确尺寸。

此外,自定义绘制是通过覆盖paintComponent(...)方法而不是paint()方法完成的。

阅读Custom Painting上Swing教程中的部分,了解有关如何执行此操作的更多信息和工作示例。