복붙노트

[SPRING] 스프링 부트는 시스템 트레이 아이콘을 사용합니다.

SPRING

스프링 부트는 시스템 트레이 아이콘을 사용합니다.

스프링 부트 애플리케이션을 설정 중이며 호스트가 일부 빈 정보에 액세스 할 수있는 시스템 트레이 아이콘에 액세스 할 수있게하려고합니다.

나는 현재 @Autowired 세부 사항을 가진 SystemTrayIcon 용 Bean을 생성하려고 시도했다. 그러나 SystemTrayIcon을 추가하려고하면 다음과 같은 예외가 발생합니다.

Caused by: java.awt.HeadlessException
    at java.awt.TrayIcon.<init>(Unknown Source)
    at java.awt.TrayIcon.<init>(Unknown Source)
    at java.awt.TrayIcon.<init>(Unknown Source)
    at hermes.subsrciber.systemTray.HermesTrayIcon.<init>(HermesTrayIcon.java:36)
    at hermes.subscriber.boot.AppStarter.trayIcon(AppStarter.java:83)
    at hermes.subscriber.boot.AppStarter$$EnhancerBySpringCGLIB$$c4f80849.CGLIB$trayIcon$3(<generated>)
    at hermes.subscriber.boot.AppStarter$$EnhancerBySpringCGLIB$$c4f80849$$FastClassBySpringCGLIB$$d62ab0bd.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:312)
    at hermes.subscriber.boot.AppStarter$$EnhancerBySpringCGLIB$$c4f80849.trayIcon(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166)
    ... 17 more

Spring Boot Application이 시스템 트레이 아이콘에 액세스 할 수있는 방법이 있습니까?

Main 메소드 (SpringApplication.run과 함께)에서 간단히 정의 할 수 있다고 믿지만 속성을 autowire 할 수는 없다.

이 설정이 가능합니까?

해결법

  1. ==============================

    1.이 솔루션은 SpringApplication.run (MyConfig.class, args)을 사용하는 대신 다음 설치 프로그램을 사용합니다.

    이 솔루션은 SpringApplication.run (MyConfig.class, args)을 사용하는 대신 다음 설치 프로그램을 사용합니다.

        SpringApplicationBuilder builder = new SpringApplicationBuilder(MyConfig.class);
        builder.headless(false);
        ConfigurableApplicationContext context = builder.run(args);
    

    실제로 시스템 아이콘을 추가하려면 다음 유형의 bean을 추가했습니다.

    public class MyTrayIcon extends TrayIcon {
    
        private static final String IMAGE_PATH = "/path/icon_16x16.png";
        private static final String TOOLTIP = "Text";
    
        private PopupMenu popup;
        private SystemTray tray;
    
        public MyTrayIcon(){
            super(createImage(IMAGE_PATH,TOOLTIP),TOOLTIP);
            popup = new PopupMenu();
            tray = SystemTray.getSystemTray();
        }
    
        @PostConstruct
        private void setup() throws AWTException{
            // popup.add(itemAbout);
            // here add the items to your popup menu. These extend MenuItem
            // popup.addSeparator();
            setPopupMenu(popup);
            tray.add(this);
        }
    
        protected static Image createImage(String path, String description){
            URL imageURL = MyTrayIcon.class.getResource(path);
            if(imageURL == null){
                System.err.println("Failed Creating Image. Resource not found: "+path);
                return null;
            }else {
                return new ImageIcon(imageURL,description).getImage();
            }
        }
    }
    
  2. ==============================

    2.누구든지 전체 코드를 원한다면 ...

    누구든지 전체 코드를 원한다면 ...

    import java.awt.AWTException;
    import java.awt.CheckboxMenuItem;
    import java.awt.Image;
    import java.awt.Menu;
    import java.awt.MenuItem;
    import java.awt.PopupMenu;
    import java.awt.SystemTray;
    import java.awt.TrayIcon;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.net.URL;
    
    import javax.annotation.PostConstruct;
    import javax.swing.ImageIcon;
    
    import org.springframework.boot.ExitCodeGenerator;
    import org.springframework.boot.SpringApplication;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.context.ConfigurableApplicationContext;
    
    public class MyTrayIcon extends TrayIcon {
    
        private static final String IMAGE_PATH = "/PATH.png";
        private static final String TOOLTIP = "Running";
        private PopupMenu popup;
        final SystemTray tray;
    
        public MyTrayIcon(){
            super(createImage(IMAGE_PATH,TOOLTIP),TOOLTIP);
            popup = new PopupMenu();
            tray = SystemTray.getSystemTray();
            try {
                setup();
            } catch (AWTException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    
    
        @PostConstruct
        private void setup() throws AWTException{
            // Create a pop-up menu components
            MenuItem exitItem = new MenuItem("Exit");
            popup.add(exitItem);
            exitItem.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    final int exitCode = 0;
                    ExitCodeGenerator exitCodeGenerator = new ExitCodeGenerator() {
    
                        @Override
                        public int getExitCode() {
                          return exitCode;
                        }
    
                      };
    
                      tray.remove(MyTrayIcon.this);
                      SpringApplication.exit(Application.context, exitCodeGenerator);
                }
            });
            // popup.addSeparator();
            setPopupMenu(popup);
            tray.add(this);
    
    
    
        }
    
        protected static Image createImage(String path, String description){
    
            URL imageURL = MyTrayIcon.class.getResource(path);
            if(imageURL == null){
                System.err.println("Failed Creating Image. Resource not found: "+path);
                return null;
            }else {
                return new ImageIcon(imageURL,description).getImage();
            }
        }
    }
    

    그리고 Application.java에서 :

    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.annotation.Bean;
    
    @SpringBootApplication
    @EnableConfigurationProperties(StorageProperties.class)
    public class Application {
    
        public static ConfigurableApplicationContext context;
    
        public static void main(String[] args) {
            //SpringApplication.run(Application.class, args);
    
            SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
            builder.headless(false);
            context = builder.run(args);
    
            MyTrayIcon m = new MyTrayIcon();
        }
    }
    
  3. from https://stackoverflow.com/questions/26564077/spring-boot-use-systemtray-icons by cc-by-sa and MIT license