Весна загрузки используйте иконки трее
Я настраиваю приложение Spring Boot и хотел бы, чтобы у хоста был доступ к значку в системном трее с доступом к некоторой информации о бобах.
В настоящее время я попытался создать боб для своего SystemTrayIcon с @Autowired деталями. Однако, когда я пытаюсь добавить 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
Существует ли какой-либо способ, которым приложение SpringBoot может иметь доступ к значкам в системном трее?
Я полагаю, что могу просто определить его в основном методе (вместе с весенним приложением.run) однако я не смогу автоматически подключать свои свойства.
Возможна ли такая установка?
2 ответа:
Решение состоит в том, чтобы вместо использования
SpringApplication.run(MyConfig.class,args)
использовать следующую настройку:SpringApplicationBuilder builder = new SpringApplicationBuilder(MyConfig.class); builder.headless(false); ConfigurableApplicationContext context = builder.run(args);
Чтобы добавить значок системы, я добавил Боб следующего типа:
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(); } } }
Если кому-то нужен полный код...
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(); } } }
И в вашем приложении.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(); } }