[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.이 솔루션은 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.누구든지 전체 코드를 원한다면 ...
누구든지 전체 코드를 원한다면 ...
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(); } }
from https://stackoverflow.com/questions/26564077/spring-boot-use-systemtray-icons by cc-by-sa and MIT license