2009-06-05 108 views
8

Estoy creando una ventana de inicio de sesión con esquinas redondeadas en java. Todo está bien, ver foto, pero estoy teniendo problemas para hacer que el JFrame/ContentPane sea transparente. Hay áreas blancas en cada esquina (mostradas por las flechas) que parece que no puedo eliminar, ya que no puedo configurar opaco a falso para JFrame o ContentPane.Crear un JFrame/ContentPane redondeado

¿Alguna idea de cómo puedo eliminar estas áreas blancas alt text http://i39.tinypic.com/dmsile.png

Respuesta

0

JFrame no pueden ser transparentes, ya que es un componente de peso pesado. Solo los componentes ligeros como JWindow pueden hacerse transparentes.

2

Desde Java 1.3 hay un truco que permite que las ventanas parcialmente transparentes, o ventanas desvanecimiento en (que suelen utilizar esto para mis pantallas de inicio), o efectos especiales (como las sombras):

  • Antes de abrir la ventana, programáticamente tome una captura de pantalla de la región donde va a estar su ventana (usando java.awt.Robot.createScreenCapture())
  • Establezca la captura de pantalla como fondo de su contenedor raíz (JPanel con rutina personalizada paintComponent())
  • Ahora puede agregar todo tipo de componentes transparentes, o pintar otro semitransparen t imagen en la parte superior del fondo.

ejemplo que crea una ventana con una sombra semitransparente con esta técnica: http://www.eclipsezone.com/eclipse/forums/t17720.html

+0

esto es factible de esta manera, pero he encontrado en algunos sistemas que puede ser realmente costoso. tomar una captura de pantalla de una configuración gigante de múltiples monitores y volver a dibujarla como fondo puede ser muy parpadeante, especialmente si el usuario puede arrastrar/mover la ventana. para un chapoteo o algo que es inmóvil, funcionaría sin embargo. –

2

No es de mucha ayuda, pero Java7 será compatible con Windows transparentes y forma: More info here. Estos ya están disponibles en Java 6u10 pero no públicamente, es decir, necesita usar una clase com.sun ... no soportada que podría cambiar en el futuro y romper su programa.

1

prueba esto. su trabajo :)

yourframe.setBackground(new Color(0, 0, 0, 180)); 
yourframe.setUndecorated(true); 
yourframe.addComponentListener(new ComponentAdapter() { 
       @Override 
       public void componentResized(ComponentEvent e) { 
        setShape(new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), 80, 80)); 
       } 
      }); 
Cuestiones relacionadas