2009-11-19 28 views
11

Estoy tratando de agregar un JLayeredPane a un JPanel y luego agregar una imagen (icono de JLabel) y un botón al JLayeredPane, pero ninguno aparece. He probado la imagen sin el botón y el panel acodado, así que sé que funciona. Aquí hay algunos códigos que estoy usando. ¿Hay algo que me falta o hago mal?agregando JLayeredPane a JPanel

 

public class MyClass extends JPanel 
{ 
    private JLayeredPane layeredPane; 
    private JLabel imageContainer = new JLabel(); 
    private JButton info = new JButton("i"); 

    MyClass(ImageIcon image) 
    { 
     super(); 

     this.imageContainer.setIcon(image); 

     this.layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(new Dimension(300, 300)); 
     layeredPane.add(imageContainer, new Integer(50)); 
     layeredPane.add(info, new Integer(100)); 

     this.add(layeredPane); 
    } 
}  
 
+1

Sin ver dónde y cómo agrega MyClass a un marco de algún tipo, no se sabe dónde se ha equivocado. –

Respuesta

15

Desde el tutorial

Por defecto, un panel de capas tiene ningún controlador de distribución. Esto significa que normalmente tiene que escribir el código que posiciona y dimensiona los componentes que coloca en un panel de capas.

Ver los cambios en su código:

import java.awt.*; 
import javax.swing.*; 
public class MyClass extends JPanel { 
    private JLayeredPane layeredPane; 
    private JLabel imageContainer = new JLabel(); 
    private JButton info = new JButton("i"); 

    MyClass(ImageIcon image) { 
     super(); 

     this.imageContainer.setIcon(image); 

     this.layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(new Dimension(300, 300)); 
     layeredPane.add(imageContainer, new Integer(50)); 
     layeredPane.add(info, new Integer(100)); 
     this.add(layeredPane); 
     // CHANGED CODE 
     // Manually set layout the components. 
     imageContainer.setBounds(0, 0, 
            image.getIconWidth(), 
            image.getIconHeight()); 
     info.setBounds(200, 00, 50, 40); 
    } 
    public static void main(String [] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new MyClass(new ImageIcon("logo.png") )); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
}  

Notas adicionales:

1) es mejor (en mi opinión) para poner la llave de apertura en la misma línea. Así es como se ve la mayoría del código Java.

2) Evite heredar de JPanel (o de cualquier otro componente) si no está realmente creando una subclase. Puede usarlo directamente sin tener que heredar (a menos que esté creando un nuevo componente.

+2

¡Gracias por la respuesta! En respuesta a la observación de la llave de apertura, la razón por la que ME no lo hace así es debido a la legibilidad en espacio en blanco. Siento que esto es una preocupación de diseño visual ya que no tiene impacto proformance. Me ayuda y sé ayuda a otros (no a todos) que no están familiarizados con el código. – asawilliams

+0

@asawilliams: De hecho, no tiene otro impacto que la legibilidad del código. Si ya conocías ese estilo y lo estás evitando intencionadamente, creo que está bien. De todos modos, hago la recomendación para aquellos que no lo saben. He encontrado desarrolladores provenientes de otros lenguajes de programación que se resisten a adoptar este estilo. ogram en otro lenguaje de programación de llaves? En cuanto a la ayuda, de nada;) – OscarRyz

+0

sí, C, C++, C#, Actionscript 3, php, .... Fue solo la forma en que me enseñaron. Puedo entender cómo a algunos programadores les gusta tener un código estricto, pero no veo ninguna otra razón para hacerlo más que preferencia. – asawilliams

4

JLayeredPane tiene un controlador de disposición nula por defecto, por lo que en su ejemplo que necesita para establecer la ubicación y el tamaño de los componentes hijos. Puede establecer un administrador de diseño en el JLayeredPane, pero eso probablemente invalidará el renderizado en capas que supongo que desea, ya que está utilizando un panel en capas.