paint()方法不会在JPanel上绘制

我在java中尝试了很少的绘图源代码并且它们工作正常,但是当我尝试制作我自己的一个时,我无法使用paint(Grahpics g)方法来工作! 我再次查看了我的代码并检查了Oracle页面中的一些教程,但我似乎无法知道为什么它不起作用。 请有人请检查一下,告诉我这里有什么问题?

主要方法:公共类主

 { public static void main(String[] args) { new board(); } } 

板:

 import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class board implements ActionListener { private JFrame f = new JFrame("Speedy"); private JPanel gamePanel = new JPanel(); private Image bg = new ImageIcon(this.getClass().getResource("road.png")).getImage(); private Timer t; private car myCar = new car(); public board() { t = new Timer(50,this); t.start(); gamePanel.setSize(600,400); gamePanel.setDoubleBuffered(true); gamePanel.setFocusable(true); gamePanel.addKeyListener(new TAdapter()); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(gamePanel,BorderLayout.CENTER); //f.addKeyListener(new TAdapter()); f.setBounds(200,100,600,400); f.setVisible(true); f.revalidate(); f.repaint(); } public void paint(Graphics g) { gamePanel.paint(g); Graphics2D g2d = (Graphics2D)g; g2d.drawImage(bg,0,0,null); g2d.drawImage(myCar.getImg(), myCar.xPos, myCar.yPos, null); System.out.println("Painted"); g.dispose(); } public void actionPerformed(ActionEvent e) { gamePanel.repaint(); //System.out.println("Painting.."); } private class TAdapter extends KeyAdapter { public void keyReleased(KeyEvent e) {} public void keyPressed(KeyEvent e) { myCar.keyPressed(e); System.out.println("You pressed: "+e); } } } 

car.java:

  import java.awt.Image; import java.awt.event.KeyEvent; import java.util.ArrayList; import javax.swing.ImageIcon ; public class car { private Image image; public int xPos,yPos; public car() { image = new ImageIcon(this.getClass().getResource("car.png")).getImage(); xPos = 300; yPos = 200; System.out.println(image.getWidth(null)); } public Image getImg() {return image;} public void move() {} public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_LEFT) xPos -= 1; if (key == KeyEvent.VK_RIGHT)xPos += 1; if (key == KeyEvent.VK_UP) yPos -= 1; if (key == KeyEvent.VK_DOWN) yPos += 1; } } 

没有错误,它显示图像的宽度是正确的,也是定时器触发ActionListenerKeyListener也正常工作,但图像不会绘制! paint(Graphics g)方法只是不想被触发! 谷歌搜索没有帮助..我认为这将是一个常见的问题,但没有人有我的问题,所有的解决方案都让我失望。 请帮忙? 如果有人能解释,将非常感谢!

您的class级Board不会扩展JPanel类。 因此,Swing永远不会调用paint()方法。 另外,语句gamePanel.repaint()只会执行gamePanel.repaint()的默认JPanel paint()方法。 相反,您希望执行重写的paint方法,因此可能希望这样做:

 public class Board extends JPanel implements ActionListener { .... public void paint(Graphics g) { this.paint(g); Graphics2D g2d = (Graphics2D)g; g2d.drawImage(bg,0,0,null); g2d.drawImage(myCar.getImg(), myCar.xPos, myCar.yPos, null); System.out.println("Painted"); g2d.dispose(); } .... } 

用此替换您的操作function:

 public void actionPerformed(ActionEvent e) { this.repaint(); } 

替代解决方案:如果您不希望Board类扩展JPanel ,您也可以在初始化时覆盖gamePanelpaint()方法。

 gamePanel = new JPanel() { @Override public void paint(Graphics g) { this.paint(g); Graphics2D g2d = (Graphics2D)g; g2d.drawImage(bg,0,0,null); g2d.drawImage(myCar.getImg(), myCar.xPos, myCar.yPos, null); g2d.dispose(); } }; 

但是,我建议使用第一个解决方案,而不是使用匿名类 。

当你在某个容器上调用repaint时,会发生什么是Swing查看该容器中的所有组件并调用它们的paint方法。

但是,您的board类(顺便说一下,您应该将其称为Board 。类名应始终以大写字母开头)不是JFrame的组件。 当您调用repaint ,Swing将尝试调用作为该JFrame组件的JPanel的paint方法。 但是你没有覆盖那个方法。 您刚刚在board添加了一种paint方法,而board不是JFrame一个组件。

因此,通常您应该创建一个扩展JPanel或其他组件的类,然后将该类的当前对象作为组件添加到JFrame。 这样,在重新绘制JFrame时将调用paint方法。

你的“主”类( board )应该扩展JPanel按预期工作。 按照你的方式,永远不会调用paint 。 它就像任何正常的自编函数一样。

如果你想保持原样,你可以做一些事情:

 gamePanel = new JPanel() { @Override public void paint(Graphics g) { //your code here } }; 

请记住, Class名称应以大写字母开头。 它不会出现任何错误,但它是一个命名约定,你可以在这里看到: http : //www.oracle.com/technetwork/java/codeconventions-135099.html