2012-01-12 13 views
5

Sono un principiante di java e per il mio primo progetto ho iniziato a costruire un gioco di Monopoli.Problemi di grafica Java

Sto costruendo la GUI in SWING usando il metodo Graphics.

Sono apparsi due problemi a cui non riesco a trovare risposta.

Il primo è che sembra che non sia possibile impostare il colore di sfondo sul mio JPanel che avevo già fatto nello stesso modo in un altro JPanel nello stesso progetto.

La seconda è che ho un NullPointerException durante il tentativo di aggiungere un image.I è riuscito a correggere questo errore con un try/catch ma sembra che la grafica non sarà paint.Again ho usato lo stesso metodo per caricare e aggiungere le immagini in un JPanel precedente e ha funzionato.

Devo dire che il mio JFrame al momento contiene 3 elementi ognuno in classi separate e sono aggiunti tramite BorderLayout().

Questo è il codice per la classe che sta creando problemi:

public class MonopolyBoard extends JPanel{ 


    Image atlantic; 
    MonopolyBoard() { 
     this.setBorder(new EtchedBorder()); 

     this.setBackground(new Color((80), (180), (210))); //this code dosent work 

     //this throws exception without try catch 
     try{ 
     ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/Atlantic Ave.jpg")); 
     atlantic = a.getImage(); 
     } 
     catch(NullPointerException e){} 
     } 

    public void paint(Graphics g){ 

      } 
      Graphics2D g2 = (Graphics2D) g; 
     //this code should draw the image but it dosent 
      g2.drawImage(atlantic, 100, 100, null); 
      g.drawImage(atlantic, 100, 100, this); 

    }; 
} 
+0

Non usare il try/catch' 'lì. Pubblica lo stacktrace. –

+4

"I programmi Swing dovrebbero sovrascrivere' paintComponent() 'invece di sovrascrivere' paint() '." - [Painting in AWT and Swing: The Paint Methods] (http://java.sun.com/products/jfc/tsc/ articoli/pittura/index.html # callback). – trashgod

+0

"questo genera un'eccezione senza try catch" - questo non è corretto. Se il blocco lancia un'eccezione, lo fa indipendentemente dal try/catch. Quello che fa il blocco try/catch è _hide_ quell'eccezione. Il che, a sua volta, rende difficile il debugging. Devi capire perché questa eccezione viene lanciata, non nasconderla sotto il tappeto. – Mat

risposta

1

Non si sa se non si stampa lo stacktrace all'interno del blocco di cattura. Se il costruttore, new ImageIcon(), non lancia l'eccezione e invece restituisce un oggetto nullo, la riga successiva, a.getImage(), causerà sicuramente un NPE perché non è possibile chiamare un metodo su un oggetto nullo.

Invece di questo

//this throws exception without try catch   
try 
{   
    ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 
    atlantic = a.getImage();   
}   
catch(NullPointerException e){} 

Prova questo

// the next line may be wrapped incorrectly due to MarkDown 
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 
if (a == null) 
{ 
    System.out.println("Can not find AtlanticAve.jpg"); 
    return; 
} 
    atlantic = a.getImage();   

La linea

// the next line may be wrapped incorrectly due to MarkDown 
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 

Fondamentalmente, è necessario iniziare a vedere che cosa potrebbe causare il costruttore se ImageIcon restituire un oggetto nullo. Questo ti porterà sulla strada giusta. Potrebbe essere qualcosa a causa di una chiamata getResource() fallita. Un modo semplice per scoprire sarebbe quello di separare la linea sopra nelle sue parti e dare loro le proprie variabili di risultato. È disordinato e inefficiente, ma a volte la risoluzione dei problemi è così.

// using _var_ because I'm too lazy to look up the return types of the methods 
var x1 = this.getClass().getResource("../Card/AtlanticAve.jpg"); 
if (x1 == null) 
{ 
    System.out.println("Can't find my resource"); 
} 

si ottiene l'immagine

+0

Sono riuscito a risolvere il problema Immagine, sembra che non abbia messo l'immagine nel pacchetto giusto ora il mio unico problema è il motivo per cui è stato impostato lo sfondo? – user1146440

1

Sono molto confuso con il codice, ma credo che il problema è che il pannello non è il disegno !, il metodo di vernice dovrebbe essere

@Override 
public void paintComponent(Graphics g){ 
    Graphics2D g2 = (Graphics2D) g; 
    //this code should draw the image but it dosent 
    g2.drawImage(atlantic, 100, 100, null); 
    g.drawImage(atlantic, 100, 100, this); 
} 
+0

Usi eclissi? Se no dovresti, dovrebbe impedirti di avere tanti problemi :) divertiti! –

+0

Io uso Netbeans ed è stato un peccato non disegnare l'immagine wasent nel pacchetto giusto ecco perché stavo ottenendo l'eccezione ora l'unico problema che ho è che lo sfondo del JPanel isent impostazione come dovrebbe – user1146440

+0

l'unica ragione che posso vedi è la risposta che ho postato, che nel tuo metodo di pittura non viene chiamato nulla. La risposta sopra dovrebbe funzionare –

1

Impostazione del colore di sfondo non ha alcun effetto perché si sostituisce paint(). Paint è responsabile del disegno dello sfondo.

È necessario dipingere il fondo nel metodo paint:

public void paint(Graphics g){ 
    // paint the background 
    g.fill(); // not sure about the parameters 
    // paint your image 
    g.drawImage(...); 
} 
+0

Grazie. Questo era il problema – user1146440