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

时间:2016-03-06 13:18:21

标签: java swing draw drawing2d

我在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)方法只是不想被触发! 谷歌搜索没有帮助..我认为这将是一个常见的问题,但没有人有我的问题,所有解决方案都让我失望。 请帮忙? 如果有人能够解释,那将非常感激!

3 个答案:

答案 0 :(得分:0)

您的班级<div itemprop="location" itemscope itemtype="http://schema.org/Place"> <span itemprop="name">Test</span> <span itemprop="address">29-31 Craven Rd, London W2 3BX</span> </div> 未延长Board班级。因此,Swing永远不会调用JPanel方法。 此外,语句paint()只会执行gamePanel.repaint()的默认JPanel paint()方法。相反,您希望执行重写的gamePanel方法,因此可能需要执行此操作:

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();
    }
    ....
}

替代解决方案: 如果您不希望public void actionPerformed(ActionEvent e) { this.repaint(); } 课程延长Board,您也可以在初始化时覆盖JPanel的{​​{1}}方法。

paint()

但是,我会推荐第一个解决方案,而不是anonymous classes

答案 1 :(得分:0)

当您在某个容器上调用repaint时,会发生的情况是Swing查看该容器中的所有组件并调用其paint方法。

但是,你的board类(顺便说一下,你应该调用它Board。类名应该总是以大写字母开头)不是你的JFrame的一个组件。当您调用repaint时,Swing将尝试调用JPanel的绘图方法,该方法是JFrame的一个组件。但是你没有覆盖那个方法。您刚刚向paint添加了board方法,board不是JFrame的组成部分。

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

答案 2 :(得分:0)

你的&#34;主要&#34; class(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