transparencia - java TrayIcon usando imagen con fondo transparente
jlabel sin fondo (6)
Estoy usando el siguiente código para establecer un icono de bandeja en Windows y Linux. Funciona de maravilla en Windows y funciona bien en Linux. En Linux (Ubuntu) tengo mi panel configurado para ser (algo) transparente y cuando agrego un GIF (con un fondo transparente) el fondo del icono se muestra gris y feo (ver imagen, diamante verde "!"). ... ¿Alguna idea sobre cómo hacer la imagen GIF? ¿Estoy agregando "mantener" su fondo transparente?
texto alternativo http://unarm.org/stackoverflow/panel_task.jpg
y la imagen que estoy usando, si quieres probar:
texto alternativo http://unarm.org/stackoverflow/green_info.gif
import java.awt.*;
import java.awt.event.*;
public class TrayFun {
static class ShowMessageListener implements ActionListener {
TrayIcon trayIcon;
String title;
String message;
TrayIcon.MessageType messageType;
ShowMessageListener(
TrayIcon trayIcon,
String title,
String message,
TrayIcon.MessageType messageType) {
this.trayIcon = trayIcon;
this.title = title;
this.message = message;
this.messageType = messageType;
}
public void actionPerformed(ActionEvent e) {
trayIcon.displayMessage(title, message, messageType);
}
}
public static void main(String args[]) {
Runnable runner = new Runnable() {
public void run() {
if (SystemTray.isSupported()) {
final SystemTray tray = SystemTray.getSystemTray();
Image image = Toolkit.getDefaultToolkit().getImage("green_info.png");
PopupMenu popup = new PopupMenu();
final TrayIcon trayIcon = new TrayIcon(image, "The Tip Text", popup);
trayIcon.setImageAutoSize(true);
MenuItem item = new MenuItem("Close");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tray.remove(trayIcon);
}
});
popup.add(item);
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println("Can''t add to tray");
}
} else {
System.err.println("Tray unavailable");
}
}
};
EventQueue.invokeLater(runner);
}
}
¿Has intentado convertirlo a .PNG (con transparencia) en su lugar? He descubierto que tienden a recibir un mejor soporte de Java (en mi experiencia)
Es probable que este problema no se pueda resolver. Depende de si Java está haciendo un buen trabajo al crear la subventana de la bandeja en Linux o no. Si Jave lo hace mal, la transparencia ya se pierde cuando se dibuja la imagen.
¿Cuál es el valor de fondo real del icono que está utilizando? ¿Es el tono gris que se muestra arriba? Configúrelo en violeta para ver si se usa la transparencia de la imagen (Java tiene por defecto el fondo gris) o no.
Asegúrese de haber probado ambas opciones de transparencia de PNG: índice de color transparente y canal alfa. El canal alfa es muy común en Linux, pero no en el mundo de Windows.
La resolución de tu icono es demasiado pequeña. Hazlo en 64x64 o mejor 128x128. AFAIK no hay una resolución estándar para los íconos de la bandeja, e incluso si es así, ciertamente no es 16x16.
Otro formato que puedes probar es SVG. Solo inténtalo después de asegurarte de que la transparencia de la imagen es el problema (ver 1).
Consulte aquí para obtener información general sobre este tema: http://www.rasterman.com/index.php?page=News (desplácese hasta el 2 de febrero de 2006)
JDIC tiene un icono de bandeja, es posible que admitan la transparencia en Linux ... https://jdic.dev.java.net/
no es eso . . . esto está sucediendo porque está usando el tema predeterminado de GNOME para representar la transparencia - no tiene nada que ver con la imagen en sí - este es un conflicto de adobe aire / gnomo - si cambia a un tema gnome si el fondo predeterminado es gris, entonces sería gris en lugar de blanco. Utiliza la imagen predeterminada del sistema, por lo que incluso si está configurada, pero el tema del panel tiene una imagen BG para que se vea brillante, como vista, por ejemplo, de lo que sería. Adobe Air / Java no sabe que sobre la ruta el tema predeterminado con transparencia y por lo tanto está utilizando el sistema predeterminado
Para aquellos que buscan una solución "real", desarrollé una pequeña biblioteca que es capaz de mostrar el ícono de la bandeja respetando la transparencia y también acepta iconos SVG (para todas las plataformas):
http://skype2gmail.blogspot.com/2011/05/java-tray-icon-transparency.html
Es una biblioteca de código abierto y el código fuente se puede encontrar aquí:
https://github.com/taksan/native-tray-adapter
La biblioteca soluciona el problema proporcionando una alternativa JNI (con GTK) cuando se ejecuta en Linux.
El problema está en el método sun.awt.X11.XTrayIconPeer.IconCanvas.paint ().
Antes de pintar, el fondo del icono se elimina de forma amateur simplemente dibujando un rectángulo del color de fondo de IconCanvas, para permitir animaciones de imagen.
public void paint(Graphics g) {
if (g != null && curW > 0 && curH > 0) {
BufferedImage bufImage = new BufferedImage(curW, curH, BufferedImage.TYPE_INT_ARGB);
Graphics2D gr = bufImage.createGraphics();
if (gr != null) {
try {
gr.setColor(getBackground());
gr.fillRect(0, 0, curW, curH);
gr.drawImage(image, 0, 0, curW, curH, observer);
gr.dispose();
g.drawImage(bufImage, 0, 0, curW, curH, null);
} finally {
gr.dispose();
}
}
}
}
ver: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521