2012-01-12 31 views
5

Soy un principiante de Java y para mi primer proyecto comencé a construir un juego Monopoly.Java Problemas de gráficos

Estoy construyendo la GUI en SWING utilizando el método de Gráficos.

Aparecieron dos problemas que no puedo encontrar una respuesta.

La primera es que parece que no puedo establecer el color de fondo en mi JPanel que anteriormente había hecho de la misma manera en otro JPanel en el mismo proyecto.

El segundo es que recibo un NullPointerException al intentar agregar una imagen. Pude corregir este error con un try/catch pero parece que los gráficos no se pintarán. Otra vez he usado el mismo método para cargar y agrega imágenes en un JPanel anterior y funcionó.

Debo mencionar que mi JFrame por el momento contiene 3 elementos cada uno en clases separadas y se agregan a través de BorderLayout().

Este es el código de la clase que está creando problemas:

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

No utilice el 'try/catch' allí. Publica la stacktrace. –

+4

"Los programas Swing deben anular' paintComponent() 'en lugar de anular' paint() '." - [Pintar en AWT y Swing: The Paint Methods] (http://java.sun.com/products/jfc/tsc/ artículos/pintura/index.html # devoluciones de llamada). – trashgod

+0

"esto arroja una excepción sin intentar atrapar" - esto es incorrecto. Si el bloque lanza una excepción, lo hace independientemente del try/catch. Lo que tu bloque try/catch hace es _hide_ esa excepción. Lo cual, a su vez, hace que sea difícil o imposible de depurar. Necesita comprender por qué se lanza esa excepción, no esconderla debajo de la alfombra. – Mat

Respuesta

1

No sabrá a menos que imprima la pila de pila dentro del bloque catch. Si el constructor, new ImageIcon(), no lanza la excepción y, en su lugar, devuelve un objeto nulo, la siguiente línea, a.getImage(), definitivamente causará un NPE porque no puede invocar un método en un objeto nulo.

En lugar de esto

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

Prueba este

// 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 línea

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

Básicamente, es necesario empezar por ver lo que podría hacer que el constructor si ImageIcon para devolver una objeto nulo Eso te llevará por el camino correcto. Puede ser algo debido a una llamada getResource() fallida. Una manera simple de averiguarlo sería separar la línea anterior en sus partes y darles sus propias variables de resultado. Es desordenado e ineficiente, pero así es como se solucionan los problemas algunas veces.

// 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"); 
} 

se obtiene la imagen

+0

He logrado resolver el problema de la imagen. Parece que coloqué la imagen en el paquete correcto. Ahora mi único problema es ¿por qué se está configurando el fondo? – user1146440

1

Estoy muy confundido con su código, pero creo que el problema es que el panel no está llegando !, su método de pintura que debe ser

@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

¿Usas eclipse? Si no es así, debería evitar que tengas tantos problemas :) ¡Diviértete! –

+0

Utilizo Netbeans y fue malo que dibujara la imagen en el paquete correcto por eso estaba obteniendo la excepción. Ahora el único problema que tengo es que el fondo de JPanel no está configurado como debería – user1146440

+0

la única razón por la que puedo ver es la respuesta que he publicado, que en su método de pintura no se llama nada. La respuesta anterior debería funcionar –

1

Ajuste del Color del fondo no tiene ningún efecto, ya que los redefina pintura(). Paint es responsable de dibujar el fondo.

Usted necesidad de pintar el fondo en su método de pintura:

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

Gracias, este fue el problema – user1146440