2012-06-02 19 views
5

बनाते समय अवैध राज्य अपवाद जब मैं bufferstrategies का उपयोग करने का तरीका जानने का प्रयास कर रहा हूं, और समग्र रूप से यह सुधार रहा हूं कि मैं अपना कोड कैसे लिखूं और चीजों को साफ कर रहा हूं। जब मैं निम्नलिखित कोड चलाने के लिए, मैं कोई त्रुटि मिलती है जब मैं "createBufferStrategy (3)"नई बफरस्ट्रेटी

package Game1Test; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.io.IOException; 

import javax.swing.*; 

public class Base extends Canvas implements Runnable{ 

    private static final long serialVersionUID = 1L; 
    private boolean running = false; 
    int ticks = 0; 

    public Base(JFrame f) { 
     setSize(f.getWidth(),f.getHeight()); 
     start(); 
    } 

    public void start(){ 
     running = true; 
     new Thread(this).start(); 
    } 
    public void stop(){ 

    } 
    public void run(){ 
     while(running){ 
      ticks++; 
      System.out.println(ticks); 
      render(); 

       try { 
        Thread.sleep(2); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
     } 
    } 
    public void render(){ 
     BufferStrategy bs = getBufferStrategy(); 
     Graphics g; 
     if(bs == null){ 
      createBufferStrategy(3); 
      requestFocus(); 
      return; 
     } 
     bs.show(); 
    } 



} 

बेस तो साथ जोड़ा जाता है:

package Game1Test; 

import java.awt.*; 

import javax.swing.JFrame; 

public class Screen extends JFrame{ 

    public final int GAME_WIDTH = 400; 
    public final int GAME_HEIGHT = 400; 
    public Dimension gameDim = new Dimension(GAME_WIDTH,GAME_HEIGHT); 
    final String gameName = "Test"; 

    public Screen(){ 
     setSize(gameDim); 
     setTitle(gameName); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
     setLayout(new GridLayout()); 
     setVisible(true); 
     setLocationRelativeTo(null); 
    } 
    public static void main(String[] args){ 
     Screen s = new Screen(); 
     s.add(new Base(s)); 
    } 
} 

मैं निम्न त्रुटि:

Exception in thread "Thread-2" 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.Canvas.createBufferStrategy(Unknown Source) 
    at java.awt.Component.createBufferStrategy(Unknown Source) 
    at java.awt.Canvas.createBufferStrategy(Unknown Source) 
    at Game1Test.Base.render(Base.java:46) 
    at Game1Test.Base.run(Base.java:33) 
    at java.lang.Thread.run(Unknown Source) 

क्या कोई मुझे बता सकता है कि यह क्यों हो रहा है? और शायद इस समस्या का समाधान?

धन्यवाद

+0

प्रति एपीआई, यह अपवाद फेंक दिया गया है यदि घटक प्रदर्शित नहीं किया जा सकता है। –

+0

@ होवरक्राफ्टफुलऑफेल इसका क्या अर्थ है? – grimrader22

उत्तर

5

API पर एक नज़र ले रहा है, अगर घटक प्रदर्शन योग्य नहीं है इस अपवाद फेंक दिया है। इस मामले में, वह तब होता है जब Canvas.peernull है। peer क्षेत्र पर एक नज़र ले रहा है पता चलता है कि

The peer is set when the Component is added to a container that also is a peer

चूंकि आप अपने घटक के निर्माता से अद्यतन धागा शुरू कर रहे हैं, render से पहले अपने घटक कभी एक और कंटेनर में जोड़ा जाता है जो मतलब होगा peernull है कहा जा सकता है, और फिर IllegalStateException फेंक दिया जाएगा।

+0

क्षमा करें अगर मैं बेवकूफ हूं, लेकिन जब घटक जोड़ा जाता है, तो मैं उस बारे में उलझन में हूं, जब शूल्ड मैं रेंडर विधि कहता हूं? – grimrader22

+0

* केवल 'रेंडर' विधि को कॉल करना चाहिए * * बेस' को कंटेनर में जोड़ा गया है। कोड में आपने हमें दिखाया है, 'बेस' को किसी कंटेनर में कभी नहीं जोड़ा जा रहा है। – Jeffrey

+0

मैंने अभी बेस कोड जोड़ा है, क्या यह बेहतर होगा अगर मैं इसे सब एक कक्षा में डालूं? – grimrader22

3

इस त्रुटि के साथ मेरे अनुभव में और आपके द्वारा लिखे गए कोड के साथ आप एक फ्रेम फ़ंक्शन खो रहे हैं।

जोड़े जहाँ आपके फ्रेम (पूर्व: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);) कर रहे हैं और समारोह frame.add(game);

जोड़ने इस उदाहरण में, मेरा Display game = new Display(); है लेकिन क्या नए प्रदर्शन के लिए अपने चर रहा है पर निर्भर करता है, यह अलग-अलग हो सकता है।