InicioHazlo Tu MismoVentanas java personalizadas al máximo (facil)
Hola bienvenidos a este nuevo post! Aquí podrás ver: Como personalizar la barra de títulos de una aplicación java. Cómo dar forma a un jFrame. Cómo hacer unjFrame translucido. Personalizando la barra de título Cuando comencé a desarrollar programas en java con interfaz gráfica una de mis primeras inquietudes fué la de prescindir de la barra de título del sistema operativo, la cual es usada x defecto x las ventanas de java (jFrame, jDialog). La verdad, al momento el método que compartiré aquí solo lo he probado en windows, pero no creo que haya mayores problemas en otros sistemas. Lo primero que debemos hacer es crear una ventana, en este caso un jFrame: Ya en este paso nos encontramos con algún problema, quienes como yo estamos acostumbrados (mal acostumbrados) a usar el asistende de creacion de GUI de NetBeans, se nos dificulta hacerlo x código, pues en realidad es mas sencillo de lo que parece, pero esa parte la dejo para vuestra propia investigación o un próximo post. En NetBeans, para crear una aplicación con GUI (Interfaz Gráfica de Usuario) sólo basta con crear un proyecto nuevo (normalmente sin clase main) y agregar en el paquete de fuentes una clase jFrame, lo que abrirá una de las benditas plantillas de Creación de ventanas: El tiulo que elegí para el proyecto es "VentanaSinBarra" (que imaginacion no??!!! XD ) Botón derecho sobre el paquete de fuentes de nuestro nuevo proyecto y crear nuevo jFrameForm: Al jFrame le puse de nombre "Ventana" (mi imaginacion sigue igual...): Pues bien, tenemos ya un jFrame pronto para editar: Pues hasta aquí nada nuevo, damos "Run" y aparece nuestro honorable jFrame, aunque aparece en la esquina superio izquierda, pues bien, en el constructor de la clase pública podemos pasarle el método: ============================ setLocationRelativeTo(null) ; ============================ Para que nuestro frame aparezca en el centro de la pantalla. Pues perfecto, ahora, lo primero que notamos es la barra de titulo, que va a tomar la apriencia del Sistema Operativo y la estética estará definida x la "skin" que tenga el usuario. En mi caso es negra pues xq yo elegí un esquema de colores obscuros mediante una skin para windows (x defecto es azul). Bien, vale aclarar que con algún LookAndFeel también puede modificarse la estética de la barra de título, pero tal vez para lograr algunos efectos interesantes (X Ej. transparencias) sea necesario remover completamente esta barra. Esto se logra con una simple linea de comando: ============================ setUndecorated(true) ; ============================ Método el cual lo pasamos antes del método x defecto el cual agrega todos los componentes "initComponents() ;" Et voilá!!! Bien, el frame ahora solo es el fondo, pero la pregunta del millón es (Redoble de tambores...): Como lo cerramos, minimizamos y/o movemos!!!??? Y pues aquí es donde erradica el LeitMotive de este post, en crear nuestra propia barra de títulos! Esto es verdaderamente sencillo: Solo debemos agregar algún componente que haga de barra cde título, x Ej. un jLabel y un par de botones: El jLabel será la barra y los botones, bueno pues botones ( XD )... Naaaa, los botones serán para cerrar y minimizar, disculpen mis chistes malos, pero es q hoy estoy de humor Recuerden que para cambiar las propiedades de cada componente pueden dar click derecho sobre dicho componente y seleccionar propiedades o properties si lo tienen como yo en inglés. Lo único que hice fué darle color gris al jLabel haciendolo también opaco para que se vea el color (todo en propiedades. el color lo eligen Uds (Esta es la gracia de tanto trabajo, que no sea el de la skin del usuario). Con código sería (luego del initComponents() ; ): ============================ jLabel1.setBackground(Color.gray); jLabel1.setOpaque(true); ============================ También para que los botones queden juntos y x sobre la label al jFrame le pasé el Layout null (ya Uds. lo harán a su manera...). También le pasé a los tres componentes el método que hace que no puedan obtener foco, ya que normalmente la barra de titulo no obtiene foco, esto se hace tambien desde las propiedades en Focusable desmarcan la casilla o con código: ============================ jLabel1.setFocusable(false) ; jButton1.setFocusable(false) ; jButton2.setFocusable(false) ; ============================ Bien, hasta aquí todo perfecto, debería verse así: Bien, ahora, en el momento de querer arrastrarlo, cerrarlo o minimizarlo, pues nada... aún los componentes no hacen nada, pero a eso vamos: En nuestra clase principal creamos dos variables de tipo int a las que les llamaremos "x" e "y": ============================ int x,y; ============================ Para poder mover nuestro frame através de la pantalla en primer lugar con el método mousePressed debemos obtener el lugar "geografico" donde fue presionado el botón, vamos con el botón derecho sobre el label y elegimos events/mouse/mousePressed: Allí se nos generará automaticamente todo el código referido a esta acción y se creará el método: ============================ private void jLabel1MousePressed(java.awt.event.MouseEvent evt) { // TODO add your handling code here: } ============================ Borramos el comentario y dentro del método agregamos: x = evt.getX () ; y = evt.getY () ; y quedará así: ============================ private void jLabel1MousePressed(java.awt.event.MouseEvent evt) { x = evt.getX () ; y = evt.getY () ; } ============================ Bien, aquí obtuvimos las coordenadas del puntero del mouse al presionar sobre la jLabel, ahora debemos indicarle al jFrame que se ubique donde sea que el mouse se mueva, esto lo logramos con el método mouseDragged. Mismo procedimiento: propiedades/mouseMotion/mouseDragged Primero que nada debemos obtener las coordenadas de la posición del mouse mientras es arrastrado: Point point = MouseInfo.getPointerInfo().getLocation() ; Si, les va a pedir importar java.awt.MouseInfo y java.awt.Point, pues lo importan (donde corresponda, x las dudas): ============================ import java.awt.MouseInfo; import java.awt.Point; ============================ Bien, luego debemos con esta información relocalizar el jFrame a medida que se mueve el cursor, pues dentro del mismo método (mouseDragged) agregamos: setLocation(point.x - x, point.y - y) ; Que no es nu mas ni menos que restar a la posición actual la original, y con esto nuestro Frame se mueve donde se mueva el cursor, el méto queda así: ============================================= private void jLabel1MouseDragged(java.awt.event.MouseEvent evt) { Point point = MouseInfo.getPointerInfo().getLocation() ; setLocation(point.x - x, point.y - y) ; } ============================================= Y pronto, solo resta correr la aplicación y moverla como si fuera una ventana con barra de titulos comun y silvestre (solo que esta la hicimos nosotros a nuestro gusto). Bien, para los botones minimizar y cerrar pues está muuucho mas sencillo aún: Para cerrar: Solo debemos agregar al método ActionPerformed de nuestro jButton una única linea de código: Botón derecho proiedades/event/action/ActionPerformed o sencillamente doble click rápido sobre el componente. System.exit(0); y pronto. Para minimizar lo mismo pero el código es: setExtendedState(ICONIFIED); También pueden agregar un icono de su preferencia y algún texto que haga honor al nombre barra de titulo. Dando Forma a nuestro jFrame X defecto los jFrames al igual que todas las ventanas y la mayoría de los componentes en java (a excepción de los jButtons con nimbus L&F), son de bordes rectos, es decir cuadrados, bueno, pues existe una manera de hacer que un jFrame tenga la forma que deseemos: Primero nuestro jframe debe estar sin decoración, es decir sin barra de título, y como en nuestro Ejemplo anterior es así, pues continuaremos con ese ejemplo. Para lograr esto, en primer lugar debemos instanciar a la clase Shape, con un objeto que va a recibir como párametros la locación de nuestra ventana y el tamaño de esta (bounds): En el caso de un rectangulo o cuadrado con bordes redondeados puede ser así: Deben hacerse algunas importaciones: ===================================== import com.sun.awt.AWTUtilities; import java.awt.Shape; import java.awt.geom.RoundRectangle2D; ================================================= =========================================================== Shape forma = new RoundRectangle2D.Double(0, 0, this.getBounds().width, this.getBounds().height, 30, 30); =========================================================== Los dos primeros ceros son la posición en la pantalla que será dada x el setlocationRelativeTo(null) (recuerdan?) así que no es necesario pasarselos... luego olo que tenemos es que la forma que estamos creando tendra los mismos límites que el jFrame, x lo que los datos serán dados x sus mismos limites. Los últimos parametros representan la curvatura del borde redondeado, pueden probar distintos valores para distintas apariencias estéticas. luego, debemos hacer que nuestro jFrame tome esa forma: =========================================================== AWTUtilities.setWindowShape(this, forma) ; =========================================================== y con eso es suficiente, recuerden que esto debe ser hecho en el constructor del frame, en este caso luego del initComponents() ; Y este es el resultado: Me parece que queda mucho mas bonito, pero eso es a gusto de cada uno. También puede hacerse con otras formas: =================================================== ... import java.awt.geom.Ellipse2D; ... ... Shape forma = new Ellipse2D.Float(0,0,getWidth(),getHeight()); =================================================== Un poligono (un poco mas complicado y eso que en el curso de informática me preguntaba para que !@* tengo una materia geometría!!!???): ============================================================== int[] puntos_x = {0, 0 + this.getWidth() / 3, 0 + 2 * (this.getWidth() / 3), this.getWidth(), 0 + 2 * (this.getWidth() / 3), 0 + this.getWidth() / 3}; int[] puntos_y = {this.getHeight() / 2, 0, 0, this.getHeight() / 2, this.getHeight(), this.getHeight()}; Shape forma = new Polygon(xPoints, yPoints, 6) ; ============================================================== El poligono recibe como parametros dos arreglos de enteros que darán la forma al frame, en este caso he realizado calculos para que tome la forma precisa del tamaño del nuestro frame (al que le cambié un poco el tamaño para que quede mas bonito), pero pueden evitarse todo este paso pasando directamente la forma que querais (aúnq esta manera es óptima). En fin, el limite es su imaginación e ingenio... Modificar la transparencia de un jFrame Bueno esto es también muy sencillo, nuestro frame debe estar sin decoración ( setUndecorated(true) ; ) y lo unico que haremos será llamar al metodo setOpacity() pasandole un float entre 0 y 1 como párametro. Para que nuestro frame tenga un 50% de opacidad: Como siempre en el constructor: ========================================= setOpacity(0.5f);//con la f aclaramos que es float ========================================= Y este es el resultado: Cuatro aclaraciones: Cuando hago referencia a métodos que modifican o tienen que ver con el jFrame (Clase principal en nuestro caso), no lo hago como this.algo pero creo que esa es la manera de hacerlo, aunque sin eso funciona ya que está explicito que se refiere a la clase principal, a gusto y/o necesidad de ustedes... Otra es que si cambiamos la forma del jFrame también deberemos cambiar el tamaño y tal vez la posición de nuestros botones de cerrar y minimizar para que sean visibles. Los botones también pueden llevar un icono, y el jFrame puede decorarse con un jLabel que le de color o alguna imagen de fondo, también a su gusto. Tener un botón que cierre nuestra aplicación puede llegar a ser extremadamente útil (x lo menos para mi lo fué) en el caso de aquellos que deseen guardar datos en un archivo de texto, x Ej. hice un reproductor de música que al cerrarse (con dicho botón) guarda todas las personalizaciones del usuario (equalización, volumen, balance e inclusive la última lista de reproducción cargada), disparando un método antes del System.exit() que escribe dichos datos los que al abrir la aplicación son cargados. Este es un buen punto de partida para este tipo de aplicaciones, en un próximo post podemos ver como guardar datos de esta manera, inclusive tengo un par de posts que se van acumulando sobre la creación de un reproductor MP3, pero para llegar a guardar los datos era necesario todo esto de quitar el botón x defecto (yo no encontré otra manera aunque estoy seguro debe haber...). Otros posts propios sobre el tema que pueden interesarte: Calculadora Java con interfaz y sonidos Menues iterativos en la consola de java Color y animaciones en la consola de java Reproductor Mp3 java Reproductor Mp3 java parte 2 Gracias x la visita, como siempre puntos, dudas, comentarios o sugerencias bienvenidos!!!
Datos archivados del Taringa! original
90puntos
936visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
3visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

d
diazespina🇦🇷
Usuario
Puntos0
Posts52
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.