How can I convert an Icon to an Image

前端 未结 3 993
隐瞒了意图╮
隐瞒了意图╮ 2020-12-10 10:30

I\'m trying to convert an Icon (javax.swing.Icon) to an Image (java.awt.Image) using this code:

private Image iconToImage(Icon icon         


        
3条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-10 11:15

    Try this :

    static Image iconToImage(Icon icon) {
       if (icon instanceof ImageIcon) {
          return ((ImageIcon)icon).getImage();
       } 
       else {
          int w = icon.getIconWidth();
          int h = icon.getIconHeight();
          GraphicsEnvironment ge = 
            GraphicsEnvironment.getLocalGraphicsEnvironment();
          GraphicsDevice gd = ge.getDefaultScreenDevice();
          GraphicsConfiguration gc = gd.getDefaultConfiguration();
          BufferedImage image = gc.createCompatibleImage(w, h);
          Graphics2D g = image.createGraphics();
          icon.paintIcon(null, g, 0, 0);
          g.dispose();
          return image;
       }
     }
    

    A complete example where we take a laf-provided icon, convert it to an Image and use it for on the Windows System Tray.

    import java.awt.*;
    import java.awt.image.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class SysTrayDemo {
        protected static TrayIcon trayIcon;
        private static PopupMenu createTrayMenu() {
            ActionListener exitListener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Bye from the tray");
                    System.exit(0);
                }
            };
    
            ActionListener executeListener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog
                       (null, "Popup from the action on the systray!",
                        "User action", JOptionPane.INFORMATION_MESSAGE);
                    trayIcon.displayMessage
                       ("Done", "You can do it again if you want!", 
                        TrayIcon.MessageType.INFO);
                }
            };
    
            PopupMenu menu = new PopupMenu();
            MenuItem execItem = new MenuItem("Action...");
            execItem.addActionListener(executeListener);
            menu.add(execItem);
    
            MenuItem exitItem = new MenuItem("Exit");
            exitItem.addActionListener(exitListener);
            menu.add(exitItem);
            return menu;
        }
    
        /**
         * using a built-in icon
         * we need to convert the icon to an Image
         */
        private static TrayIcon createTrayIconFromBuiltInIcon() {
            Icon icon = UIManager.getIcon("OptionPane.warningIcon");
            PopupMenu popup = createTrayMenu();
            Image image = iconToImage(icon);
            TrayIcon ti = new TrayIcon(image, "Java System Tray Demo", popup);
            ti.setImageAutoSize(true);
            return ti;
        }
    
        static Image iconToImage(Icon icon) {
              if (icon instanceof ImageIcon) {
                  return ((ImageIcon)icon).getImage();
              } else {
                  int w = icon.getIconWidth();
                  int h = icon.getIconHeight();
                  GraphicsEnvironment ge = 
                    GraphicsEnvironment.getLocalGraphicsEnvironment();
                  GraphicsDevice gd = ge.getDefaultScreenDevice();
                  GraphicsConfiguration gc = gd.getDefaultConfiguration();
                  BufferedImage image = gc.createCompatibleImage(w, h);
                  Graphics2D g = image.createGraphics();
                  icon.paintIcon(null, g, 0, 0);
                  g.dispose();
                  return image;
              }
          }
    
        public static void main(String[] args) throws Exception {
            if (!SystemTray.isSupported()) {
                System.out.println
                   ("System tray not supported on this platform");
                System.exit(1);
            }
    
            try {
                SystemTray sysTray = SystemTray.getSystemTray();
                trayIcon = createTrayIconFromBuiltInIcon();
                sysTray.add(trayIcon);
                trayIcon.displayMessage("Ready",
                    "Tray icon started and tready", TrayIcon.MessageType.INFO);
            }
            catch (AWTException e) {
                System.out.println("Unable to add icon to the system tray");
                System.exit(1);
            }
        }
    }
    

提交回复
热议问题