Swing Breakout: crea una ventana translúcida
Para generar ventanas translúcidas y evitar el uso de codificación local, solo las ventanas translúcidas que aplican instantáneas de pantalla de manera flexible son una de las características más deseadas de Swing, y también pueden denominarse ventanas de formas especiales. Parte de esta ventana es transparente y a través de ella se pueden ver el fondo del escritorio y otros programas. Java no puede generar ventanas translúcidas para nosotros sin pasar JNI (Interfaz nativa de Java) (incluso si podemos hacer esto, la plataforma operativa local debe admitir ventanas translúcidas). Sin JNI, Java no puede generar ventanas translúcidas para nosotros (incluso si puede generar ventanas translúcidas, debe ser compatible con la plataforma operativa local), pero la situación actual no puede detener nuestro deseo de ventanas translúcidas, usando una de mis herramientas favoritas. Para simular una ventana translúcida, puedes lograr engañosamente una ventana translúcida. El proceso de creación de una ventana translúcida se logra tomando una captura de pantalla antes de que se muestre la ventana; usando la captura de pantalla del paso anterior como imagen de fondo de la ventana y reposicionando la captura de pantalla para que coincida con la pantalla real, creando la ilusión de translucidez; . El truco está en cómo actualizar la captura de pantalla cuando movemos o cambiamos la ventana translúcida, es decir, actualizar el fondo de la ventana translúcida. Antes de comenzar nuestro viaje, creemos una clase heredada de JPanel, usaremos esta clase heredada para capturar la pantalla y usar la foto capturada como fondo. El código para esta clase se muestra a continuación.
Ejemplo: TransparentBackgroundComponent clase pública TransparentBackground extiende Jponent {marco JFrame privado; fondo de imagen privado; fondo transparente público (marco JFrame) {este marco = marco; actualizarFondo (); */public void updateBackground( ) {prueba {Robot rbt = new Robot( ); Toolkit tk = Toolkit getDefaultToolkit( ); Dimensión dim = tk getScreenSize( }/**? dim getWidth( ) ?(int)dim getHeight( )));} catch (Exception ex) {/p(ex toString( )); // Dado que se desconoce el contexto, este método no se declara y no afectará la ejecución. , así que coméntelo ex printStackTrace( }} public void paintComponent(Graphics g) {Point pos = this getLocationOnScreen( ); Point offset = new Point( pos x pos y drawImage(fondo offset x offset y null) ;}} Primero, el constructor guarda la referencia del JFrame principal y luego llama al método updateBackground(), en el cual podemos capturar la pantalla completa usando la clase java awt Robot y guardar la imagen capturada en una variable definida, esta variable mantenga el fondo. El método paintComponent () puede ayudarnos a obtener la posición absoluta de la ventana en la pantalla y utilizar el fondo recién obtenido como imagen de fondo del panel. La imagen de fondo se moverá de acuerdo con la posición del panel, de modo que el fondo. del panel no tiene nada que ver con la parte de la pantalla cubierta por el panel. Las costuras se superponen mientras que los paneles también se relacionan con la pantalla circundante.
Simplemente ejecutamos el método principal a continuación, colocamos algunos componentes aleatorios en el panel y luego mostramos el panel en un marco public static void main(String[] args) {JFrame frame = new JFrame(Transparent Window);TransparentBackground bg = new TransparentBackground (marco); bg setLayout(new BorderLayout( )); botón JButton = nuevo JButton (Este es un botón); bg add(Botón Norte); ;frame getContentPane() add(Center bg);frame pack();frame setSize();frame show();} El efecto de ejecutar este código es como se muestra en la siguiente figura. Se muestra la ventana translúcida en este código. Bastante simple, pero tiene dos inconvenientes. Primero, el fondo del panel no se actualiza automáticamente si se mueve la ventana, y la función paintComponent() solo actualiza el fondo cuando se mueve la ventana. paintComponent() solo se llamará cuando cambie el tamaño de la ventana; en segundo lugar, si la pantalla cambia, la ventana que creamos nunca se combinará con el fondo de la pantalla. Nadie quiere actualizar las capturas de pantalla de vez en cuando. Imagínese si quisiéramos encontrar algo escondido detrás de una ventana, obtener una nueva captura de pantalla y luego tener que actualizar nuestra captura de pantalla con nuevas capturas de pantalla de vez en cuando. Piénselo, intentar encontrar lo que se esconde detrás de la ventana, obtener nuevas capturas de pantalla y actualizar nuestra ventana semitransparente con esa captura de vez en cuando es suficiente para evitar que el usuario realice su trabajo. De hecho, es casi imposible realizar cambios en la pantalla fuera de la ventana, pero la mayoría de los cambios ocurren cuando la ventana de primer plano cambia de foco o se mueve.
Si acepta esto (al menos eso creo), entonces puede monitorear los eventos mencionados a continuación y actualizar la captura de pantalla solo cuando se activen estos eventos public class TransparentBackground extiende JComponentimplements ComponentListener WindowFocusListener Runnable {private JFrame frame; última actualización =; actualización booleana solicitada = verdadero; fondo transparente público (marco JFrame) { este marco = marco; actualizarFondo(); marco addComponentListener (este marco) addWindowFocusListener (este) inicio ( ); (ComponentEvent evt) { repintar ( ); public void ponentResized (ComponentEvent evt) { repintar ( ); public void ponentMoved (ComponentEvent evt) { repintar ( } public void ponentHidden (ComponentEvent evt) { }public void windowGainedFocus (WindowEvent); evt) { refresco( ); public void windowLostFocus(WindowEvent evt) { refresco( } Primero, dejemos que nuestra ventana translúcida (es decir, el panel) implemente la interfaz ComponentListener, la interfaz WindowFocusListener y la interfaz Runnable. capturar los cambios de movimiento, tamaño y enfoque de la ventana, e implementar la interfaz Runnable permite que el panel genere un hilo para controlar el método repaint() personalizado.
La interfaz ComponentListener contiene cuatro métodos que comienzan con componente, todos los cuales pueden llamar fácilmente al método repaint(), de modo que el fondo de la ventana se pueda actualizar en consecuencia a medida que la ventana se mueve y cambia de tamaño, y dos métodos que solo llaman a refresco( ) Método de procesamiento de enfoque, como se muestra a continuación actualización de anulación pública ( ) {if(frame isVideo) {if(frame isVideo) {if(frame isVideo) {if(frame isVideo) {if(frame isVideo) {if(frame isVideo) { if (el marco esVideo) {if(el marco esVideo) ( ) {if(el marco esVisible( )){repaint(); actualizarRequested=true; lastupdate=new Date( ) getTime( }} public void run( ) {intenta { while (verdadero) {Hilo suspendido( ); largo ahora = nueva Fecha( ) getTime( ); if(refreshRequested amp; amp; ((ahora última actualización) gt; )){if(frame isVisible( )){Ubicación del punto = frame getLocation (); frame hide(); updateBackground(); frame show( ); frame setLocation(ubicación); última actualización = ahora; updateRequested = false; ( ));ex printStackTrace( );}} lishixinzhi/Article/program/Java/hx/201311/26738