Foros del Web » Programación para mayores de 30 ;) » Java »

Canvas tapa un menú desplegable

Estas en el tema de Canvas tapa un menú desplegable en el foro de Java en Foros del Web. Tengo añadidos en un JFrame un objeto Canvas y una barra de menús. El Canvas parte de la posición (0, 0), y sobre ella están ...
  #1 (permalink)  
Antiguo 08/08/2008, 05:52
 
Fecha de Ingreso: mayo-2005
Mensajes: 510
Antigüedad: 19 años, 6 meses
Puntos: 1
Pregunta Canvas tapa un menú desplegable

Tengo añadidos en un JFrame un objeto Canvas y una barra de menús. El Canvas parte de la posición (0, 0), y sobre ella están los menús desplegables.

El problema surge al desplegar estos menús, q se muestran bajo el canvas.

He probado a cambiar el orden de creación de los objetos (primero el Canvas y luego los menús) pero no funciona, sigue ocultándose.

¿Sabéis cómo podría solucionarlo? Muchas gracias.
  #2 (permalink)  
Antiguo 11/08/2008, 04:55
 
Fecha de Ingreso: mayo-2005
Mensajes: 510
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: Canvas tapa un menú desplegable

¿Alguna idea?
  #3 (permalink)  
Antiguo 11/08/2008, 12:14
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Canvas tapa un menú desplegable

Hola,

Creo que depende de la forma que creaste el menú.
JMenuBar no debería de darte ese problema, con el adecuado layout.
Sería útil que mostraras esa parte del código.

Saludos,
  #4 (permalink)  
Antiguo 12/08/2008, 06:46
 
Fecha de Ingreso: mayo-2005
Mensajes: 510
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: Canvas tapa un menú desplegable

Aps, ok. No he establecido ningún layout, siempre me lío con ellos... Voy a ello, gracias!
  #5 (permalink)  
Antiguo 12/08/2008, 08:37
 
Fecha de Ingreso: mayo-2005
Mensajes: 510
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: Canvas tapa un menú desplegable

A ver... Me estoy perdiendo en el mundo de los layouts!
Por lo q sé, para añadir un menú a un JFrame se hace así:
Código:
setJMenuBar(miJMenuBar);
Pero si en el mismo JFrame en el q quiero q aparezca el menú, quiero establecer otros componentes con un GridBagLayout, ¿cómo puedo hacerlo? El tema del JMenuBar va al margen del Layout o... Porq mi problema es q no puedo añadirlo como si fuera otro componente más, de la forma
Código:
add(miJMenuBar, miGridBagConstraints);
¿no?

He intentado hacer esa prueba, poniendo el menú en la parte superior del layout, y en la parte inferior un Canvas un JPanel, pero el menú de esta forma no se muestra, y supongo q es q así no se puede añadir, y debo usar setJMenuBar(miJMenuBar).

¿Cómo puedo hacer para insertar mis componentes en un layout, y a la vez tener un menú del tipo JMenuBar?
  #6 (permalink)  
Antiguo 12/08/2008, 16:49
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Canvas tapa un menú desplegable

Hola,

Cita:
Iniciado por AnDrEa MM Ver Mensaje
... El Canvas parte de la posición (0, 0), y sobre ella están los menús desplegables. ...
Posición 0, 0 ?
Solo con un layout de tipo absoluto puedes ponerlo en 0, 0.
Y creo que con un layout absoluto en la posición 0, 0 vas a tener ese tipo de incovenientes.

Cita:
Iniciado por AnDrEa MM Ver Mensaje
... Pero si en el mismo JFrame en el q quiero q aparezca el menú, quiero establecer otros componentes con un GridBagLayout, ... ¿Cómo puedo hacer para insertar mis componentes en un layout, y a la vez tener un menú del tipo JMenuBar?
Asignas el Grid Bag Layout en el JFrame :
getContentPane().setLayout(new java.awt.GridBagLayout());

Agregas los controles :
getContentPane().add(jButton1, new java.awt.GridBagConstraints());

Agregas el Menu Bar :
setJMenuBar(jMenuBar1);
pack();


De esta forma te muestra el menú y los controles en el espacio disponible.
Si no muestras el código no es posible revisar si hay algún error.
Espero haber sido de ayuda.

Saludos,

ps:

Dependiendo de la version de Java que estes usando (1.1,1.2),
no es lo mismo: "getContentPane().add(" que "add(".

Última edición por HackmanC; 12/08/2008 a las 16:55 Razón: ps
  #7 (permalink)  
Antiguo 13/08/2008, 04:16
 
Fecha de Ingreso: mayo-2005
Mensajes: 510
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: Canvas tapa un menú desplegable

Gracias por la ayuda HackmanC!
Aunque no he conseguido resolver el problema :(

Adjunto el código para poder indicar qué hago:

- Clase JFrame: creo un JFrame en el q añado un menú, un Canvas (lienzo) y un TextArea (info).

Código:
public class JFrame extends javax.swing.JFrame {
	static protected JMenuBar jmb;
	static protected JMenu jm;
        static protected JMenuItem nuevo;
        private Lienzo lienzo;
        private Info info;

public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame jf = new JFrame();
                jf.setSize(1280, 770);
                jf.setVisible(true);
            }
        });
    }
    
    public JFrame() {
    	crearMenu();
        initComponents();
    }
    
    public void crearMenu() {	
        jmb = new JMenuBar(); // BARRA DE MENUS        
        jm = new JMenu("  Archivo  ");
        nuevo = new JMenuItem("  Nuevo  "); 
        jm.add(nuevo);
    }

    private void initComponents() {
    	getContentPane().setLayout(new java.awt.GridBagLayout());
        lienzo  = new Lienzo();
        getContentPane().add(lienzo, new java.awt.GridBagConstraints());
        info = new Info();
        getContentPane().add(info, new java.awt.GridBagConstraints());
        setJMenuBar(jmb);
        pack();
    }
}
- La clase Lienzo, q es un Canvas, tiene el siguiente aspecto:

Código:
public class Lienzo extends java.awt.Canvas {

    public Lienzo() {
    	setBounds(10, 10, 920, 599);
    	setBackground(Color.BLACK);
    }
}
- Y la clase Info (un TextArea) el siguiente:

Código:
public class Info extends Panel {	

	public Info() {
		setBounds(10, 610, 920, 113);
		TextArea ta = new TextArea();		
		this.add(ta);
    }
}
Al ejecutar el programa, me salen los 3 componentes en el JFrame (no en la disposición q deseo, pero eso se soluciona con los atributos del Layout), pero el problema es q al desplegar el menú, éste aparece detrás del Canvas (lienzo).

Según comentaste anteriormente, un buen uso del Layout no debe mostrar ese problema, así q deduzco q estoy haciendo algo mal, pero no sé qué puede ser.
  #8 (permalink)  
Antiguo 13/08/2008, 18:33
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Canvas tapa un menú desplegable

Cita:
Iniciado por AnDrEa MM Ver Mensaje
Al ejecutar el programa, me salen los 3 componentes en el JFrame (no en la disposición q deseo, pero eso se soluciona con los atributos del Layout), pero el problema es q al desplegar el menú, éste aparece detrás del Canvas (lienzo).

Según comentaste anteriormente, un buen uso del Layout no debe mostrar ese problema, así q deduzco q estoy haciendo algo mal, pero no sé qué puede ser.
Hola,

No estas haciendo nada mal, creí que posiblemente un mal uso del layout en otra configuración de componentes podría dar el problema. En tu caso prueba a agregar la siguiente línea de código antes de inicializar cualquier componente de tipo menú.

Código:
public JFrame() {
  javax.swing.JPopupMenu.setDefaultLightWeightPopupEnabled(false);
  crearMenu();
  initComponents();
}

Saludos,

ps:

Creo que el motivo probable es que algunos los componentes del package java.awt.* son componentes antiguos (de Java 1.0) basados en una estructura más simple (Light Weight) que Swing. Y no funcionan igual que los componentes Swing.
  #9 (permalink)  
Antiguo 14/08/2008, 00:49
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Canvas tapa un menú desplegable

Hola:

Efectivamente, los componentes awt y en concreto Canvas tienen ese problema. He visto muchas aplicaciones en las que el menú se va por detrás del Canvas y he visto que al desplegar un JPopupMenu haciendo click derecho sobre el Canvas, dependiendo de la posición en que se hace el click, dicho JPopupMenu sale o no.

Mi consejo es que elimines el Canvas y uses en su lugar un JComponent. No tienes que tocar mucho código (sólo el extends Canvas) y posiblemente desaparezcan todos los problemas de este tipo.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #10 (permalink)  
Antiguo 14/08/2008, 01:07
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Canvas tapa un menú desplegable

Cita:
Iniciado por chuidiang Ver Mensaje
Mi consejo es que elimines el Canvas y uses en su lugar un JComponent. No tienes que tocar mucho código (sólo el extends Canvas) y posiblemente desaparezcan todos los problemas de este tipo.
Hola,

¡ Seguro !
Me concentré en el hecho que querías un java.awt.Canvas (Creo que agregaron esa función "setDefaultLightWeightPopupEnabled" posteriormente a la implementación de "JPopupMenu" por este problema).
Pero la solución de chuidiang es la correcta.

Saludos.
  #11 (permalink)  
Antiguo 18/08/2008, 17:13
 
Fecha de Ingreso: mayo-2005
Mensajes: 510
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: Canvas tapa un menú desplegable

Hola,

Gracias por la información. He probado ambas soluciones y las dos funcionan. Me quedo con la primera, aunq parece, según vuestros comentarios, q no es la más adecuada... Pero el JComponent me desestructura los tamaños de los componentes y tendría q cambiar código.

Saludos!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:49.