2012-09-05 19 views
15

Estoy intentando que se agregue un icono y se muestre a la bandeja del sistema utilizando Java. Sin embargo, el icono siempre es demasiado pequeño o está cortado en áreas. Es el segundo de la izquierda en caso de que no puedas decirlo.El icono de la bandeja del sistema aparece distorsionado

¿Qué estoy haciendo mal aquí? ¿Cómo puedo hacer que este icono se muestre por completo? ¿Cuál es el tamaño de icono estándar que se utilizará para la bandeja del sistema?

Editar: Estoy utilizando AWT SystemTray y TrayIcon

Respuesta

25

Después de haber recuperado el recurso de imagen real de disco, puede cambiar su tamaño para el tamaño que necesita mediante la creación de un "falso" uno sobre la marcha y tomando su anchura.

Encontré que esto era mejor que usar el método setImageAutoSize(true), ya que ese método no escala la imagen sin problemas.

BufferedImage trayIconImage = ImageIO.read(getClass().getResource("/path/to/icon.png")); 
int trayIconWidth = new TrayIcon(trayIconImage).getSize().width; 
TrayIcon trayIcon = new TrayIcon(trayIconImage.getScaledInstance(trayIconWidth, -1, Image.SCALE_SMOOTH)); 
+1

+1 para hacer referencia al manual fino, creo que OP necesita para hacer su primera parada. –

+0

Muy buena solución. –

+0

Lo sentimos, no está funcionando para agregar una imagen de fondo transparente en Linux. – Gopal00005

8

Para mostrar el icono de un tamaño óptimo, tendrá que cambiar manualmente el tamaño al tamaño correcto. Este tamaño correcto puede diferir entre los sistemas operativos y las preferencias, por lo que Java proporciona un método para adquirir las dimensiones del icono de la barra de tareas, que son 16x16 en el caso de su imagen de ejemplo.

if (SystemTray.isSupported()) { 
    SystemTray tray = SystemTray.getSystemTray(); 
    Dimension trayIconSize = tray.getTrayIconSize(); 
    // resize icon image to trayIconSize 
    // create your tray icon off of the resized image 
} 
+0

¿Cómo cambiar el tamaño? –

+0

Cambiar el tamaño de una imagen es bastante simple; [aquí hay un buen tutorial] (http://www.mkyong.com/java/how-to-resize-an-image-in-java/) en él. – Vulcan

+0

16x16 parece demasiado pequeño en mi barra de tareas –

6

Según TrayIcon.setImageAutoSize(boolean).

Establece la propiedad de tamaño automático. El tamaño automático determina si la imagen de la bandeja se ajusta automáticamente al tamaño para ajustarse al espacio asignado para la imagen en la bandeja. De forma predeterminada, la propiedad de tamaño automático se establece en falso.

Si la función de tamaño es falso, y el tamaño de la imagen no coincide con el espacio de icono de la bandeja, la imagen se pinta como está dentro de ese espacio - si es más grande que el espacio asignado, que aparecerá recortado.

+5

+1 ... mientras que la solución * más fácil sería configurar el icono de la bandeja para que automáticamente se dimensione a sí mismo, es desafortunado que, internamente, parezca estar usando un algoritmo poco suave que la mayoría de la gente considerará inaceptable para el uso de producción. La imagen con cambio de tamaño automático no será suave y tendrá bordes dentados. Sospecho que esto se hace por motivos de rendimiento. Normalmente hago el cambio de tamaño manualmente: http://stackoverflow.com/a/12287388/216104 – Redandwhite

1

He terminado combinando algunas de estas respuestas para hacer el código que estoy usando.

Esto produce un icono atractivo en la bandeja del sistema desde un png que comienza en 100x100.

Vale la pena señalar que en una MacBook de retina el icono se ve peor. Así que hago un control en otro lugar para ver si se está ejecutando en un Mac y no lo aplique si es así.

public Image imageForTray(SystemTray theTray){ 

    Image trayImage = Toolkit.getDefaultToolkit().getImage("my100x100icon.png"); 
    Dimension trayIconSize = theTray.getTrayIconSize(); 
    trayImage = trayImage.getScaledInstance(trayIconSize.width, trayIconSize.height, Image.SCALE_SMOOTH); 

    return trayImage; 
} 
Cuestiones relacionadas