Я использую следующий код для установки значка в трее в Windows и Linux. Он прекрасно работает в Windows и нормально работает в Linux. В Linux (Ubuntu) моя панель настроена на (отчасти) прозрачную, и когда я добавляю GIF (с прозрачным фоном), фон значка становится серым и некрасивым (см. Изображение, зеленый ромб "!"). ... Есть идеи, как сделать изображение GIF, которое я добавляю, "сохранить" его прозрачный фон?
альтернативный текст http://unarm.org/stackoverflow/panel_task.jpg
и изображение, которое я использую, если вы хотите протестировать:
альтернативный текст 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);
}
}
вопрос, это изображение значка выглядит непрозрачным при отображении в другом месте? Например, веб-страницу?
Это в некотором роде секрет, но я планирую выпустить его, скорее всего, как проект с открытым исходным кодом здесь довольно скоро. Изображение выглядит нормально при отображении в любом другом месте. Вы можете видеть, что я встроил изображение под моим изображением панели задач и над кодом.




Вы пытались вместо этого преобразовать его в .PNG (с прозрачностью)? Я обнаружил, что они, как правило, лучше поддерживаются Java (по моему опыту)
Скорее всего, эта проблема не может быть решена. Это зависит от того, хорошо ли Java справляется с созданием подокна в трее в Linux или нет. Если Jave делает это неправильно, прозрачность уже теряется при отрисовке изображения.
Каково реальное значение фона используемого вами значка? Это серый тон, показанный выше? Установите фиолетовый цвет, чтобы увидеть, используется ли прозрачность изображения (по умолчанию в Java используется серый фон) или нет.
Убедитесь, что вы попробовали оба варианта прозрачности PNG: индекс прозрачного цвета и альфа-канал. Альфа-канал очень распространен в Linux, но не в мире Windows.
У вашего значка слишком мало разрешения. Сделайте это в формате 64x64 или лучше 128x128. AFAIK нет стандартного разрешения для значков в трее, и даже если так, то уж точно не 16x16.
Другой формат, который вы можете попробовать, - это SVG. Попробуйте это сделать только после того, как убедитесь, что проблема заключается в прозрачности изображения (см. 1).
См. Здесь справочную информацию по этому вопросу: http://www.rasterman.com/index.php?page=News (прокрутите вниз до 2 февраля 2006 г.)
Спасибо. 1) Он прозрачный (клетчатый фон) ... Я попытался сделать его фиолетовым, и он оказался фиолетовым в лотке. 2) Я попробовал все разные варианты PNG при сохранении в GIMP, и все они дали одинаковый результат 3) Я также попробовал значки разных размеров с тем же результатом 4) Я попробовал SVG ... все они были серыми.
К сожалению, закончилось место. Спасибо за идеи. А у вас есть какие-нибудь другие идеи?
Так что, если Java действительно не понимает прозрачности изображения, это действительно странно. Возможно, попробуйте нарисовать изображение внутри приложения. Или, возможно, для этих изображений есть определенные варианты. Я не знаю, что делать еще (возможно, доступен другой API, кроме SystemTray?)
У JDIC есть значок в трее, они могут поддерживать прозрачность в Linux ... https://jdic.dev.java.net/
Это не то . . . это случается, потому что для рендеринга прозрачности используется тема GNOME по умолчанию - она не имеет ничего общего с самим изображением - это конфликт Adobe Air / gnome - если вы переключаетесь на тему gnome, фон по умолчанию серый, то он был бы серым вместо белого. Он использует системное изображение по умолчанию, поэтому, даже если оно было установлено, но тема для панели должна иметь изображение BG, чтобы оно выглядело глянцевым, например, как перспектива, чем это было бы. Adobe Air / Java не знает, что вы перешли к теме по умолчанию с прозрачностью, и поэтому он использует системное значение по умолчанию.
Я просто проверяю эту «теорию», и это действительно правда.
Проблема заключается в методе sun.awt.X11.XTrayIconPeer.IconCanvas.paint ()!
Перед рисованием фон значка по-любительски очищается путем простого рисования прямоугольника цвета фона IconCanvas, чтобы разрешить анимацию изображения.
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();
}
}
}
}
см .: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521
Для тех, кто ищет «реальное» решение, я разработал небольшую библиотеку, которая способна отображать значок в трее с учетом прозрачности, а также принимает значки SVG (для всех платформ):
http://skype2gmail.blogspot.com/2011/05/java-tray-icon-transparency.html
Это библиотека с открытым исходным кодом, и исходный код можно найти здесь:
https://github.com/taksan/native-tray-adapter
Библиотека позволяет обойти проблему, предоставляя альтернативу JNI (с GTK) при работе под Linux.
Я заметил, что в этом репозитории GitHub не было большой активности с 2011 года. Это все еще жизнеспособное решение? Я задокументировал некоторые другие проблемы с лотком платформы здесь: stackoverflow.com/a/35919788/3196753. Было бы неплохо иметь надежно работающее кроссплатформенное решение.
В некоторых языковых экосистемах (таких как миры Erlang, Haskell и Clojure) отсутствие активности и открытие проблем означает, что он не был сломан с самого начала. Я ищу библиотеки, количество проблем которых сокращается, в идеале - ноль.
Думаю, вам придется переключиться на квадратный значок :( :( Я рад, что вы нашли SystemTray хорошей альтернативой для своего демона-приложения. Что это за новое приложение? :) Это секрет?