为什么Java repaint()方法不重绘?我的代码是正确的

时间:2017-08-09 11:34:34

标签: java swing awt

我从2008 Java Book(Java Heads First)中提取了这段代码。并在同一时间提取其他代码。一个是工作,另一个不是。两者都在动画中使用repaint()方法。我非常仔细地比较了两个代码,它们是一样的!我无法解释为什么这段代码不会重新绘制自己......只有在我最小化和最大化时才会重新绘制,但在for循环期间不会重新绘制。我将向您展示不起作用的代码。感谢您的任何意见。

代码:

import javax.swing.*;
import java.awt.*;

public class ProstaAnimacja {

  int x = 70;
  int y = 70;

  public static void main(String[] args) {
    ProstaAnimacja gui = new ProstaAnimacja();
    gui.doRoboty();
  }

  public void doRoboty() {
    JFrame ramka = new JFrame();
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MojPanelRysunkowy panel = new MojPanelRysunkowy();

    ramka.getContentPane().add(panel);
    ramka.setSize(300,300);
    ramka.setVisible(true);

    for (int i = 0; i < 130; i++) {
      x++;
      y++;

      panel.repaint();

      try {
        Thread.sleep(100);
      } catch (Exception ex) { }
    } 
  } // koniec doRoboty()

  public class MojPanelRysunkowy extends JPanel {
    public void paintComponent(Graphics g) {
      g.setColor(Color.green);
      g.fillOval(x,y,40,40);
    }
  } // koniec klasy wewnętrznej

} // koniec klasy zewnętrznej

1 个答案:

答案 0 :(得分:1)

您错过了对super.paintComponent(Graphics g)的来电,这就是为什么:)修复实施:

import javax.swing.*;
import java.awt.*;

public class ProstaAnimacja {

  int x = 70;
  int y = 70;

  public static void main(String[] args) {
    ProstaAnimacja gui = new ProstaAnimacja();
    gui.doRoboty();
  }

  public void doRoboty() {
    JFrame ramka = new JFrame();
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MojPanelRysunkowy panel = new MojPanelRysunkowy();

    ramka.getContentPane().add(panel);
    ramka.setSize(300,300);
    ramka.setVisible(true);

    for (int i = 0; i < 130; i++) {
      x++;
      y++;

      panel.repaint();

      try {
        Thread.sleep(100);
      } catch (Exception ex) { }
    } 
  } // koniec doRoboty()

  public class MojPanelRysunkowy extends JPanel {
    public void paintComponent(Graphics g) {
      //The fix is in the next line - it clears the background 
      super.paintComponent(g);
      g.setColor(Color.green);
      g.fillOval(x,y,40,40);
    }
  } // koniec klasy wewnętrznej

} // koniec klasy zewnętrznej