문제

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);
  }
}
도움이 되었습니까?

해결책

이 문제는 해결되지 않을 가능성이 있습니다.Java가 Linux에서 트레이 하위 창을 생성하는 데 제대로 작동하는지 여부에 따라 다릅니다.Jave가 잘못하면 이미지를 그릴 때 이미 투명도가 손실됩니다.

  1. 사용중인 아이콘의 실제 배경 값은 무엇입니까?위에 보이는 회색 톤인가요?이미지의 투명도가 사용되는지 확인하려면 보라색으로 설정하십시오(Java의 기본값은 회색 배경임).

  2. PNG의 투명도 옵션을 모두 시도했는지 확인하십시오.투명한 색상 인덱스와 알파 채널.알파 채널은 Linux에서는 매우 일반적이지만 Windows에서는 그렇지 않습니다.

  3. 아이콘의 해상도가 너무 작습니다.64x64 또는 더 나은 128x128로 수행하십시오.AFAIK 트레이 아이콘에 대한 표준 해상도는 없으며, 그렇더라도 확실히 16x16은 아닙니다.

  4. 시도해 볼 수 있는 또 다른 형식은 SVG입니다.이미지의 투명도가 문제인지 확인한 후에만 시도하십시오(1 참조).

이 문제에 대한 배경 정보는 여기를 참조하세요.http://www.rasterman.com/index.php?page=뉴스 (2006년 2월 2일까지 아래로 스크롤)

다른 팁

문제는 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

라이브러리는 Linux에서 실행할 때 JNI 대안 (GTK 포함)을 제공하여 문제를 해결합니다.

JDIC에는 트레이 아이콘이 있으며 Linux의 투명성을 지원할 수 있습니다.https://jdic.dev.java.net/

대신 .png (투명성)로 변환 해 보셨습니까? 나는 그들이 Java (내 경험상)에 의해 더 잘 지원되는 경향이 있음을 알았습니다.

그게 아니고 . . . 투명성을 렌더링하기 위해 기본 그놈 테마를 사용하고 있기 때문에 이것은 행복합니다. 이미지 자체와 관련이 없습니다. 이것은 Adobe Air / Gnome 충돌입니다. Gnome 테마로 전환하면 기본 배경이 회색 인 경우. 흰색 대신 회색이 될 것입니다. 시스템 기본 이미지를 사용하므로 설정된 경우에도 패널의 테마는 예를 들어 Vista처럼 광택이있어서 BG 이미지를 갖도록하는 테마입니다. Adobe Air / Java는 귀하가 도로를 통해 투명성이있는 테마 기본값을 알지 못하고 시스템 기본값을 사용하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top