有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JComponent的java重绘方法不起作用

我正在做一个2D游戏,现在我遇到了一个问题。 下面代码的最后一个目标是在全屏窗口中移动对象

这是我代码的一部分:

public class mainTest {
public static void main(String args[])
{
    DisplayMode displayMode=new DisplayMode(1024,768,64,75);
    GameScreen gameScreen=new GameScreen(displayMode,"background.jpg");
    Sprite s=new Sprite("some.png");
    gameScreen.addSprite(s);
    gameScreen.start();
}
}

我使用了两种start()方法。一个原因是NullPointerException,我已经对其进行了评论,另一个不起作用:

public class GameScreen extends JComponent{
    private Screen screen;
    private ArrayList<Sprite> sprites=new ArrayList<Sprite>();
    private Image background;

    //...(constructor)

    public void addSprite(Sprite sprite)
    {
        sprites.add(sprite);
    }
//  public void draw()
//  {
//      Graphics g=screen.getWindow().getGraphics();
//      g.drawImage(background,0,0,null);
//      for(Sprite i:sprites)
//      {
//          g.drawImage(i.getImage(),(int)i.getX(),(int)i.getY(),null);
//      }
//      g.dispose();
//  }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(background,0,0,null);
        for(Sprite i:sprites)
        {
            g.drawImage(i.getImage(),(int)i.getX(),(int)i.getY(),null);
        }
        g.dispose();
    }
    public void start()
    {
        //draw();
        repaint();
        long currentTime=System.currentTimeMillis();
        while(true)
        {
            long elapsedTime=System.currentTimeMillis()-currentTime;
            for(Sprite i:sprites)
            {
                i.update(elapsedTime);
            }
            currentTime+=elapsedTime;
            //draw();
            repaint();
        }
    }
}

这是我的Sprite类的update()方法:

public void update(long elapsedTime)
    {
        x+=vx*elapsedTime;
        y+=vy*elapsedTime;
    }

虽然vxvy显示速度

如您所见,我首先使用方法getGraphicsI()来获取图形对象,并在我的draw()方法中调用了它的drawImage()方法,但正如我所说,我得到了NullPointerException。所以

一,。它对一个窗口的getGraphics()意味着什么,以及

二,。为什么我会有例外

三,。我为什么要dispose(){}反对?或者一个更好的问题:我应该dispose()它吗

然后我使用了另一种方法:使我的类扩展JComponent,重写paintComponent(),并在start()方法中使用repaint()。所以

四,。使这个类扩展JComponent合适吗?这是否意味着GameScreen类是一个可以绘制东西的地方

五,。为什么我的代码不起作用?它进入无限循环,而不退出。 但是为什么我在屏幕上什么都看不到呢

更新: 有关更多信息,请参阅我的Screen类:

public class Screen {
    private DisplayMode displayMode;
    private JFrame window;
    private GraphicsDevice device;
    public Screen (DisplayMode dm)
    {
        window=new JFrame();
        device=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        displayMode=dm;
    }
    public void setFullScreen()
    {
        device.setFullScreenWindow(window);
        device.setDisplayMode(displayMode);
        window.setResizable(false);
        window.setUndecorated(true);
        window.setBackground(Color.black);
        window.setForeground(Color.white);
    }
    public Window getWindow()
    {
        return device.getFullScreenWindow();
    }
}

更新2:

NullPointerException的堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException at

GameScreen.draw(GameScreen.java:25) at

GameScreen.start(GameScreen.java:46) at

mainTest.main(mainTest.java:11)

其中GameScreen类的第25行属于getGraphics()方法

注意:

我的问题不是由无限循环引起的,因为我更改了程序,使循环在两秒钟后结束;但是我的问题没有解决,我在屏幕上什么也看不到


共 (0) 个答案