尝试运行我的Game Launcher时抛出IllegalStateException

时间:2014-11-22 16:51:45

标签: java eclipse launcher illegalstateexception

我正在尝试启动一个游戏启动器,它工作正常,直到昨天(我已经编写了大部分代码),然后它就开始在整个地方抛出非法状态异常,就像没有明天一样。

我为我的生活找不到解决方案:(

所以这是我的代码:

package com.MHafi.Pandora.gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

import com.MHafi.Pandora.Configuration;
import com.MHafi.Pandora.Display;
import com.MHafi.Pandora.RunGame;
import com.MHafi.Pandora.input.InputHandler;

public class Launcher extends JFrame implements Runnable {
    private static final long serialVersionUID = 1L;

    protected JPanel window = new JPanel();
    private JFrame frame = new JFrame();

    Configuration config = new Configuration();

    private int width = 800;
    private int height = 390;
    protected int button_width = 80;
    protected int button_height = 39;
    boolean running = false;
    Thread thread;
    private BufferedImage img;

    public Launcher(int id) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
        e.printStackTrace();
    }

    frame.setUndecorated(true);
    frame.setTitle(Display.TITLE + " Launcher");
    frame.setSize(new Dimension(width, height));
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.getContentPane().add(window);
    //frame.add(this);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setVisible(true);
    window.setLayout(null);
    System.out.println("YAY");

    InputHandler input = new InputHandler();
    addKeyListener(input);
    addFocusListener(input);
    addMouseListener(input);
    addMouseMotionListener(input);
    startMenu();
    frame.repaint();

}

public void updateFrame() {
    if (InputHandler.dragged) {
        Point p = frame.getLocation();
        int x = frame.getX();
        int y = frame.getY();
        frame.setLocation (x + InputHandler.MouseDX - InputHandler.MousePX, y +                InputHandler.MouseDY - InputHandler.MousePY);
    }
}

public void startMenu() {
    running = true;
    thread = new Thread(this, "menu");
    thread.start();
    }

public void stopMenu() {
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public void run() {
    requestFocus();
    while (running) {
        renderMenu();
        updateFrame();
    }
}

private void renderMenu() throws IllegalStateException {
    System.out.println("1");
    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        System.out.println("2");
    }
    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, 800, 390);
    System.out.println("3");

    try {
        g.drawImage(ImageIO.read(Launcher.class.getResource("/Launcher.png")), 0, 0, 800, 390, null);
        System.out.println("4");
        if (InputHandler.MouseX > 50 && InputHandler.MouseX < 50 + 60 && InputHandler.MouseY > 110 && InputHandler.MouseY < 110 + 25)   {
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/play_on.png")), 50, 110, 60, 30, null);
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Pointer.png")), 115, 118, 30, 14, null);
            if (InputHandler.MouseButton == 1)  {
                config.loadConfiguration("res/config/config.xml");
                dispose();
                new RunGame();
            }
        } else {
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/play_off.png")), 50, 110, 60, 30, null);
        }
        if (InputHandler.MouseX > 50 && InputHandler.MouseX < 50 + 60 && InputHandler.MouseY > 140 && InputHandler.MouseY < 140 + 25)   {
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Options_on.png")), 50, 141, 100, 30, null);
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Pointer.png")), 155, 149, 30, 14, null);
            if (InputHandler.MouseButton == 1)  {
                System.out.println("Options");
            }
        } else {
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Options_off.png")), 50, 140, 100, 30, null);
        }   
        if (InputHandler.MouseX > 50 && InputHandler.MouseX < 50 + 60 && InputHandler.MouseY > 175 && InputHandler.MouseY < 175 + 25)   {
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Help_on.png")), 50, 175, 60, 30, null);
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Pointer.png")), 115, 183, 30, 14, null);

        } else {
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Help_off.png")), 50, 175, 60, 30, null);
        }   
        if (InputHandler.MouseX > 50 && InputHandler.MouseX < 50 + 60 && InputHandler.MouseY > 210 && InputHandler.MouseY < 210 + 25)   {
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Quit_on.png")), 50, 210, 60, 30, null);
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Pointer.png")), 115, 218, 30, 14, null);
            if (InputHandler.MouseButton == 1)  {
                System.exit(0);
            }
        } else {
            g.drawImage(ImageIO.read(Launcher.class.getResource("/menu/Quit_off.png")), 50, 210, 60, 30, null);
        }   

    } catch (IOException e) {
        e.printStackTrace();
    }
    g.dispose();
    bs.show();

}
}

这是抛出的错误:

YAY
1
Exception in thread "menu" java.lang.IllegalStateException: Component must have a valid peer
at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source)
at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source)
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Window.createBufferStrategy(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Window.createBufferStrategy(Unknown Source)

那是怎么回事?

为什么我不能创建BufferStrategy?

1 个答案:

答案 0 :(得分:0)

我在这里看到的一个问题是createBufferStrategy(3)方法中的这个调用renderMenu。如果createBufferStrategy(或者更为一般,JFrame)之前没有设置可见(或添加到{/ 1>},则方法Window会导致此类异常可见的组件as you can see in the JavaDoc

我看到两种解决方法:

  • 考虑private JFrame frame的目的以及是否应该使用this,因为Launcher本身就是JFrame(您将frame设为可见,而不是Launcher实例)
  • this.getBufferStrategy()createBufferStrategy(3)更改为frame.getBufferStrategy()frame.createBufferStrategy(3)

如果您使用了第二个想法,那么还要考虑将JFrame删除为Launcher的父类,因为它会创建一个自己的JFrame实例,而不是使用“他自己”作为JFrame

相关问题