2014-11-22 41 views
0

我试图启动一个游戏启动器,它工作正常,直到昨天(我已经写了大部分代码),然后它只是开始抛出非法状态异常像明天一样没有地方。当试图运行我的游戏启动器时抛出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?

回答

0

那么,我在这里看到的问题是renderMenu方法中的createBufferStrategy(3)。如果JFrame(或更一般的Window)未设置为可见(或添加到可见的组件)as you can see in the JavaDoc,方法createBufferStrategy可能会导致此类异常。

我看到两种方法来解决这个问题:

  • 想想private JFrame frame的目的,如果你要使用this代替,因为LauncherJFrame本身(你设置frame为可见,而不是Launcher实例)
  • 变化this.getBufferStrategy()createBufferStrategy(3)frame.getBufferStrategy()frame.createBufferStrategy(3)

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

相关问题