【问题标题】:Java: paint doesn't call with repaintJava:paint 不调用 repaint
【发布时间】:2015-07-16 03:28:01
【问题描述】:

说实话,我真的不知道自己在做什么。 我刚从 python 迁移到 Java,我还在努力适应所有的类和类型的东西。

我决定放弃 Java 概念教程,开始动手实践。据我了解,我是用挥杆在屏幕上画一个球,让它移动。

我尝试设计一个球对象来处理球的位置和屏幕碰撞,但球根本没有移动。当我打开调试时,我注意到paint() 函数只在创建时被调用,而不是被repaint() 调用。

我有一种感觉,我正在使用一个糟糕的教程来做这些事情,看起来有更好的方法来做。

无论如何,我很高兴听到你们的想法。

编辑:在看到您的 cmets 后,我注意到当我将 sysout 放在那里时,实际上调用了paint。在我输入sysout in paint() 之前,调试器似乎没有跳转到那里。我的猜测是我并没有真正改变球的位置。

@SuppressWarnings("serial")
public class Tennis extends JPanel {
    Ball ball = new Ball(50,50);

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                RenderingHints.VALUE_ANTIALIAS_ON);
        int[] position = ball.getPosition();
        g2d.fillOval(position[0],position[1], 30, 30);
    }

    public static void main(String[] args) {

        JFrame frame = new JFrame("Mini Tennis");

        Tennis game = new Tennis();
        frame.add(game);
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        while (true) {
            // just change the position and check for bump
            game.ball.move(game.getHeight(), game.getWidth());
            game.repaint();

            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}

【问题讨论】:

  • 使用 super.paintComponent(g) 代替 super.paint(g)。然后每次你想改变图形时,使用 repaint()
  • repaint() 每秒被调用约 100 次,对吗?循环中没有发生什么奇怪的事情?
  • 实际方法应该是paintComponent()而不是paint()
  • “我有一种感觉,我正在使用一个糟糕的教程来做这些事情..” 链接到它。从它产生的代码的外观来看,这个教程很垃圾。
  • 您发布的代码无法编译。 When I turn on the debug I noticed that the paint() function get called only at creation, - 对我来说很好。我在绘画方法中添加了一个 System.out.println(...) 语句,它会不断显示。如果您需要更多帮助,请发布正确的 SSCCE 来说明问题。

标签: java swing paint


【解决方案1】:

将paint() 更改为paintComponent(),有关其中差异的说明,请参见this

@Override
public void paintComponent(Graphics g){ //CHANGE HERE
    super.paintComponent(g);            //AND HERE
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
            RenderingHints.VALUE_ANTIALIAS_ON);
    int[] position = ball.getPosition();
    g2d.fillOval(position[0],position[1], 30, 30);
}

【讨论】:

  • 也许你应该提及你改变了什么,以及为什么。
  • @Xarathorn 好一点,是的。但是,逐字重复大量原始问题的代码会使您的更改难以看到。
  • @VGR 添加了有关更改位置的 cmets 并删除了所有未更改的方法,好吗?
  • @Xarathorn 绝对更好。
猜你喜欢
  • 2017-01-03
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多