Fondo animado JPanel

Esta es una pregunta muy general, pero ¿cómo debo agregar un fondo animado para un JPanel? Quiero que el fondo esté detrás de todos los componentes y gráficos del panel. En este momento, tengo dos clases separadas (una para el panel principal y otra para el fondo). La clase de fondo usa repintar() para animar una cuadrícula que se mueve por la pantalla. He intentado que el fondo del panel principal sea transparente, pero eso no me ha llevado a ninguna parte.

Aún más información: Mi panel principal es parte de un CardLayout y tiene muchas clases diferentes. Entonces, cuando agrego mi panel principal a mi marco principal, estoy haciendo frame.getContentPane().add(cards, BorderLayout.CENTER)

cards es un JPanel que actúa como contenedor para el panel principal y todos los paneles dentro del panel principal.

¿Alguien puede ayudarme a obtener un fondo animado del panel?

preguntado el 11 de abril de 13 a las 04:04

Y si alguien puede ayudarme a agregar una clase de fondo animada a todo el JFrame, sería de gran ayuda. -

2 Respuestas

Puedes usar Toolkit.getImage() para cargar la imagen animada y luego dibujar la imagen en el contenedor paintComponent. Asegúrate que ImageObserver está configurado (no es nulo) para actualizar los cuadros de animación correctamente. Para obtener detalles sobre cómo se carga, observa y actualiza la imagen, consulte Cómo se cargan las imágenes apéndice en Referencia de AWT de Java.

He aquí un ejemplo sencillo:

import java.awt.*;
import javax.swing.*;
import java.net.URL;

class AnimatedPanelDemo {
    static class ImagePanel extends JPanel {
        private Image image;
        ImagePanel(Image image) {
            this.image = image;
        }
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image,0,0,getWidth(),getHeight(),this);
        }
    }

    private static void createAndShowUI() {
        try {
            JFrame frame = new JFrame("Image");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);

            Image image = Toolkit.getDefaultToolkit().getImage(new URL(
                    "http://duke.kenai.com/iconSized/duke.running.gif"));

            ImagePanel imagePanel = new ImagePanel(image);

            imagePanel.add(new JLabel("Some label"));
            frame.add(imagePanel);
            frame.setSize(100, 100);
            frame.setVisible(true);
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

Respondido 11 Abr '13, 05:04

Bueno, esta es mi primera respuesta en stackoverflow.

Intentaré ayudarme con mi curva de aprendizaje con este complejo API de AWT y Swift.

Debajo está el constructor que extiende JFrame

package xpto;

import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.WindowStateListener;
import java.awt.image.ImageObserver;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import sun.java2d.SunGraphicsEnvironment;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class FrameLuckyRaffle extends JFrame {

    /**
     * 
     */
    private JLabel backgroundLabel;
    private ImageIcon imageIcon;
    private Image bgImage;


    /**
     * Constructor of this frame.
     */
    public FrameLuckyRaffle(String background, final String dbname) {
        try {
            setTitle("Lucky Raffle of "+ dbname);

            GraphicsConfiguration config = this.getGraphicsConfiguration();
            Rectangle usableBounds = SunGraphicsEnvironment.
                                     getUsableBounds(config.getDevice());
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setBounds(100, 100, (int)(usableBounds.getWidth()*0.8), 
                                (int)(usableBounds.getHeight()*0.8));
            setMinimumSize(new Dimension(1024, 700));
            setResizable(true);
            setDefaultLookAndFeelDecorated(true);

            backgroundLabel = new JLabel() {
               public void paintComponent(Graphics g) {
            // alternative --> g.drawImage(bgImage, 0, 0, null);
            // I prefer to control the new ImageObserver parameter as bellow
                    g.drawImage(bgImage, 0, 0, new ImageObserver() {
                    @Override
                    public boolean imageUpdate(Image img, int infoflags, 
                                               int x, int y, int width, int height) {
                        img.getScaledInstance(getWidth(),getHeight(),
                                              Image.SCALE_FAST);
                        return true;
                    }
               });
           // this is used to have easier control on 
           // image manipulation on my application
              Graphics2D g2d = (Graphics2D)g; 
              super.paintComponent(g2d);
              revalidate();
              repaint();
          }
      };
      backgroundLabel.setBounds(0, 0, 0, 0);
      // this is necessary if you want more child 
      // components to be visible on the JFrame afterwards
      backgroundLabel.setOpaque(false);  
      setContentPane(backgroundLabel);

      addWindowListener(new WindowListener() {
          @Override
          public void windowOpened(WindowEvent e) {
        // Set Frame Background
             imageIcon = new ImageIcon(Toolkit.getDefaultToolkit().
                        createImage(FrameBusinessPure.class.getResource(background)));
             bgImage = imageIcon.getImage().
                       getScaledInstance(getWidth(),getHeight(), Image.SCALE_FAST);
          }
        // Even after closing the window, JVM didn't Garbage Collected the instanced
        // objects, for some reason. Forcing the objects to null helped on that.
          @Override
          public void windowClosed(WindowEvent e) {
              backgroundLabel = null;
              imageIcon = null;
              bgImage = null;
              System.gc();
          }
      });

      addWindowStateListener(new WindowStateListener() {
          @Override
          public void windowStateChanged(WindowEvent e) {

        // if you flush the object on runtime you will surpass the
        // memory leak on using GIFs and most complex graphics

              bgImage.flush();
              bgImage = imageIcon.getImage().
                        getScaledInstance(getWidth(),getHeight(), Image.SCALE_FAST);
          }
       });

    addMouseMotionListener(new MouseMotionListener() {
        @Override
        public void mouseDragged(MouseEvent e) {

      // if you flush the object on runtime you will surpass the
      // memory leak on using GIFs and most complex graphics

           bgImage.flush();
           bgImage = imageIcon.getImage().
                     getScaledInstance(getWidth(),getHeight(), Image.SCALE_FAST);
       });
       }catch (Exception e) {
           e.printStackTrace();
       }
    }
}

Siéntase libre de aprender más en el siguiente enlace

https://www.oracle.com/java/technologies/painting.html

Respondido el 18 de junio de 20 a las 12:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.