سؤال

أنا أستخدم الكود التالي لتعيين أيقونة الدرج في نظامي التشغيل 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. دقة الرمز الخاص بك صغيرة جدًا.افعل ذلك بحجم 64 × 64 أو 128 × 128 أفضل.AFAIK لا توجد دقة قياسية لأيقونات الدرج، وحتى إذا كان الأمر كذلك، فمن المؤكد أنها ليست 16 × 16.

  4. التنسيق الآخر الذي يمكنك تجربته هو SVG.حاول ذلك فقط بعد التأكد من أن شفافية الصورة هي المشكلة (انظر 1).

انظر هنا للحصول على معلومات أساسية حول هذه المشكلة:http://www.rasterman.com/index.php?page=News (انتقل للأسفل حتى 2 فبراير 2006)

نصائح أخرى

والمشكلة تكمن في طريقة 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. أفعل؟ bug_id = 6453521

لأولئك الذين يبحثون عن حل "الحقيقي"، أنا وضعت مكتبة صغيرة قادرة على عرض رمز علبة تكريم الشفافية ويقبل أيضا الرموز SVG (لجميع الأنظمة الأساسية):

http://skype2gmail.blogspot.com/2011/05/java-tray -icon-transparency.html

وإنه لمكتبة مفتوحة المصدر ويمكن العثور على شفرة المصدر هنا:

https://github.com/taksan/native-tray-adapter

وعمل مكتبة التفافية المشكلة من خلال توفير بديل JNI (مع GTK) عند تشغيل لينكس.

وJDIC لديها رمز علبة، لأنها قد تدعم الشفافية في لينكس ... https://jdic.dev.java.net/

هل حاولت تحويله إلى بابوا نيو غينيا (بشفافية) بدلا من ذلك؟ لقد وجدت أنها تميل إلى أن تكون معتمدة بشكل أفضل من خلال جافا (من خلال تجربتي)

وليس لها ذلك. . . هذا هو happing لأنه يستخدم موضوع GNOME الافتراضي لجعل الشفافية - عليها أن تفعل مع صورة له النفس شيء - وهذا هو الصراع الهواء / جنوم اللبن - إذا قمت بالتبديل إلى موضوع جنوم والخلفية الافتراضية هو رمادي ثم سيكون من الرمادي بدلا من الأبيض. ويستخدم صورة النظام الافتراضي لذلك حتى لو تم تعيين ذلك، ولكن موضوع لوحة لديهم صورة BG لجعلها تبدو لامعة مثل ويندوز فيستا على سبيل المثال من أنها ستفعل ذلك. أدوبي إير / جافا لا تعرف أنك على الطريق الافتراضي موضوع بشفافية ولذلك فإنه يستخدم النظام الافتراضي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top