2011-10-29 16 views
6

Estoy intentando crear gradualmente una imagen basada en las entradas del usuario. Lo que estoy tratando de hacer es crear un grupo de gráficos y agregarlos como capas, sin embargo, tengo algunos problemas, ya que no aparecerán. Aquí está el código que estoy usando:Los gráficos no se muestran en JLayeredPane (java swing)

public class ClassA 
{ 
    protected final static int dimesionsY = 1000; 
    private static int dimesionsX; 
    private static JFrame window; 
    private static JLayeredPane layeredPane; 

    public void init() 
    { 
     window = new JFrame("Foo"); 
     dimesionsX = // some user input 
     window.setPreferredSize(new Dimension(dimesionsX, dimesionsY)); 
     window.setLayout(new BorderLayout()); 

      layeredPane = new JLayeredPane(); 
     layeredPane.setBounds(0, 0, dimesionsX, dimesionsY); 
     window.add(layeredPane, BorderLayout.CENTER); 

      ClassB myGraphic = new ClassB();  
     myGraphic.drawGraphic(); 

     layeredPane.add(myGrpahic, new Integer(0), 0); 

     window.pack(); 
     window.setVisible(true); 
    } 
} 



public class ClassB extends JPanel 
{ 
    public void drawGraphic() 
    { 
     repaint(); 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     g.setColor(Color.BLACK); 
     g.fillRect(10, 10, 100, 100); 
    } 
} 

Sin embargo, mi gráfico no parece aparecer y no entiendo por qué. También intenté agregarlo primero a un JPanel, agregando que JPanel al JLayeredPane, pero eso tampoco funcionó.

Por favor alguien me puede ayudar?

Respuesta

13

Si agrega un componente a un JLayeredPane, es como agregarlo a un diseño nulo usando contenedor: debe especificar completamente el tamaño y la posición del componente.

por ejemplo,

import java.awt.*; 

import javax.swing.*; 

public class ClassA { 
    protected final static int dimesionsY = 800; 
    protected final static int dimesionsX = 1000; //!! 
    private static JFrame window; 
    private static JLayeredPane layeredPane; 

    public void init() { 
     window = new JFrame("Foo"); 
     // !! dimesionsX = // some user input 

     //!! window.setPreferredSize(new Dimension(dimesionsX, dimesionsY)); 
     window.setLayout(new BorderLayout()); 

     layeredPane = new JLayeredPane(); 
     //!! layeredPane.setBounds(0, 0, dimesionsX, dimesionsY); 
     layeredPane.setPreferredSize(new Dimension(dimesionsX, dimesionsY)); 
     window.add(layeredPane, BorderLayout.CENTER); 

     ClassB myGraphic = new ClassB(); 
     myGraphic.drawGraphic(); 

     myGraphic.setSize(layeredPane.getPreferredSize()); 
     myGraphic.setLocation(0, 0); 
     //!! layeredPane.add(myGraphic, new Integer(0), 0); 
     layeredPane.add(myGraphic, JLayeredPane.DEFAULT_LAYER); 

     window.pack(); 
     window.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new ClassA().init(); 
    } 
} 

class ClassB extends JPanel { 
    public void drawGraphic() { 
     repaint(); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.setColor(Color.BLACK); 
     g.fillRect(10, 10, 100, 100); 
    } 
} 
+0

Además, si estás poniendo JPanels una encima de la otra, es de esperar que esté tomando cuidado de que opaca se establece en false. Otra solución para su problema incluye capas de imágenes búfer una encima de la otra. –

+0

Gracias por su ayuda en esto. Noté que usaste 'JLayeredPane.DEFAULT_LAYER' cuando agregaste el gráfico. Me preguntaba qué es lo mejor para usar en el caso de que quiera agregar gráficos adicionales. –

+0

Usaría cualquier lógica que dicte para trabajar mejor. Si tengo algo que sé que estará en la parte inferior, lo pondré en la capa predeterminada. –

0

Ver Laying Out Components in a Layered Pane, desde Los Tutoriales de Java.

Además, a veces es necesario para establecer el tamaño preferido:

layeredPane.setPreferredSize(new Dimension(width, height));