java - progressbar - Cuadrado negro que se muestra al agregar un.GIF en JPanel
poner barra de progreso en java (3)
Al mirar tu código, no veo nada malo. Solo para estar seguro, probé tu código tal como está, añadiendo mi propio JFrame y JPanel. Aquí es a lo que terminé:
import javax.swing.*;
import java.net.*;
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setSize(600, 400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
String loadLink = "http://i.imgur.com/mHm6LYH.gif";
URL ajaxLoad = null;
try {
ajaxLoad = new URL(loadLink);
} catch (MalformedURLException e3) {
e3.printStackTrace();
}
ImageIcon loading = new ImageIcon(ajaxLoad);
JLabel loadBar = new JLabel(loading);
loadBar.setBounds(70, 60, 54, 55);
loadBar.setOpaque(false);
panel.add(loadBar);
frame.add(panel);
frame.setVisible(true);
}
}
Cuando lo ejecuté, funcionó como debería, sin ningún problema. El .GIF estaba animado y en su lugar apropiado en el marco. ¿Podría copiar el código anterior y probar que funciona para usted de la misma manera? Además, ¿podría mostrarnos su código en el que inicializa su JFrame y JPanel que contienen la imagen? Gracias.
Mi problema es que al agregar un .GIF a un JPanel, muestra este fondo cuadrado negro para .GIF.
Resultado al agregar JPanel:
Sucede cuando uso esta línea:
p2.add(loadBar); // where p2 = new JPanel();
Sin embargo, cuando agrego el mismo .GIF en JFrame, el cuadrado negro ya no está allí. Me gusta esto:
jf.add(loadBar); // where jf = new JFrame();
Resultado al agregar JFrame:
Parte del código de clase:
String loadLink = "http://i.imgur.com/mHm6LYH.gif";
URL ajaxLoad = null;
try {
ajaxLoad = new URL(loadLink);
} catch (MalformedURLException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}
ImageIcon loading = new ImageIcon(ajaxLoad);
JLabel loadBar = new JLabel(loading);
loadBar.setBounds(70, 60, 54, 55);
loadBar.setOpaque(false);
//jf.add(loadBar);
p2.add(loadBar);
¿Podría alguien explicar por qué está sucediendo así? Gracias por tu tiempo y lectura.
EDITAR:
// Creates the Initialization Panel
p2 = new JPanel();
// Sets the background, black with 125 as alpha value
// This is less transparent
p2.setLayout(null);
p2.setBackground(new Color(0,0,0,150));
// Sets a border to the JPanel
p2.setBorder(new LineBorder(Color.WHITE));
// Sets some size to the panels
p2.setBounds(20, 20, 200, 150);
// Adds the loading gif
String loadLink = "http://i.imgur.com/mHm6LYH.gif";
URL ajaxLoad = null;
try {
ajaxLoad = new URL(loadLink);
} catch (MalformedURLException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}
ImageIcon loading = new ImageIcon(ajaxLoad);
JLabel loadBar = new JLabel(loading);
loadBar.setBounds(70, 60, 54, 55);
loadBar.setOpaque(false);
p2.add(loadBar);
Ese es el JPanel que se muestra en la primera imagen sin JLabel. Realmente no puedo mostrar la parte JFrame en el código porque está repartida por toda la clase. Pero no creo que el problema sea con JFrame, así que podría ser este JPanel: /
Lleva tiempo cargar la imagen según su primera instantánea.
Eche un vistazo a Monitoreo con un ImageObserver para verificar el estado de la imagen.
Agregue la imagen en JPanel
cuando esté completamente cargada.
Código de muestra:
new Thread(new Runnable() {
@Override
public void run() {
int width = loading.getIconWidth();
if (width >= 0) {
isImageLoaded = true;
p2.add(loadBar);
return;
}
// Wait if the image is not loaded yet
while (!isImageLoaded) {
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}).start();
Tu problema está aquí ...
p2.setBackground(new Color(0,0,0,150));
Swing no es compatible con backgounds basados en alfa, ya sea que tu componente sea transparente o no lo sea.
Hacer esto significa que el componente "intenta" usar el valor alfa como color de relleno de fondo, pero el administrador de pintura no sabe que debería pintar debajo del componente, lo que causa todo tipo de problemas y problemas.
Ahora, esto es un poco complicado. setOpaque(false)
hacer que el contenedor sea transparente utilizando setOpaque(false)
, pero esto significa que el fondo no está pintado.
Lo que necesita hacer es crear un componente personalizado, establecer su propiedad opaque
en false
y anular su método paintComponent
y rellenar el fondo con su color basado en alfa. Normalmente me gusta usar AlphaComposite
, pero esto funciona tan bien ...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class TranslucentPanelExample {
public static void main(String[] args) {
new TranslucentPanelExample();
}
public TranslucentPanelExample() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
try {
JLabel background = new JLabel(
new ImageIcon(ImageIO.read(
getClass().getResource("/background.jpg"))));
background.setLayout(new GridBagLayout());
background.add(new WaitPane());
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(background);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException exp) {
exp.printStackTrace();
}
}
});
}
public class WaitPane extends JPanel {
public WaitPane() {
setLayout(new GridBagLayout());
setBorder(new EmptyBorder(12, 12, 12, 12));
// This is very important
setOpaque(false);
setBackground(new Color(0, 0, 0, 150));
String loadLink = "http://i.imgur.com/mHm6LYH.gif";
URL ajaxLoad = null;
try {
ajaxLoad = new URL(loadLink);
} catch (MalformedURLException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}
ImageIcon loading = new ImageIcon(ajaxLoad);
JLabel loadBar = new JLabel(loading);
loadBar.setHorizontalAlignment(JLabel.CENTER);
loadBar.setVerticalAlignment(JLabel.CENTER);
add(loadBar);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
}
}
Gerentes de diseño, administradores de diseño, administradores de diseño ...
No puedo hacer suficiente hincapié en la importancia de los administradores de diseño. Confías en números "mágicos" que pueden no coincidir siempre con la realidad ...