java swing icons system-tray trayicon

java - El icono de la bandeja del sistema se ve distorsionado



swing icons (4)

Estoy tratando de agregar un ícono y mostrarlo en la bandeja del sistema usando Java. Sin embargo, el icono siempre es demasiado pequeño o está recortado en áreas. Es el segundo de la izquierda en caso de que no puedas decirlo.

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

Edición: Estoy usando AWT SystemTray y TrayIcon


De acuerdo con 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 espacio asignado para la imagen en la bandeja. De forma predeterminada, la propiedad de tamaño automático se establece en falso.

Si el tamaño automático es falso y el tamaño de la imagen no coincide con el espacio del icono de la bandeja, la imagen se pinta como está dentro de ese espacio; si es más grande que el espacio asignado, se recortará.


Para mostrar el icono en un tamaño óptimo, deberá cambiarlo manualmente 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 }


Terminé combinando algunas de estas respuestas para hacer el código que estoy usando.

Esto produce un ícono atractivo en la bandeja de mi sistema desde un png que comienza en 100x100.

Vale la pena señalar que en una MacBook de la retina, el ícono luce peor. Así que hago una comprobación en otro lugar para ver si se está ejecutando en un mac y no aplico esto si lo es.

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; }


Una vez que haya recuperado el recurso de imagen real del disco, puede redimensionarlo al tamaño que necesita creando uno "falso" sobre la marcha y tomando su ancho.

Descubrí que esto era mejor que usar el setImageAutoSize(true) , ya que ese método no escala la imagen en absoluto.

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));