2014-10-25 2 views
2

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

현재 @Autowired 세부 정보가있는 SystemTrayIcon 용 Bean을 만들려고합니다. 그러나 나는 다음과 같은 예외 얻을은 SystemTrayIcon 추가하려고하면하십시오 SpringBoot 응용 프로그램은 시스템 트레이 아이콘에 액세스 할 수있는 방법이

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 

거기를?

나는 메인 메소드 (SpringApplication.run을 따라)에서 간단하게 정의 할 수 있다고 믿지만, 내 속성을 autowire 할 수는 없다.

이 설정이 가능합니까?

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(); 
     } 
    } 
} 

답변

5

다음 설정을 사용하여 전체 코드가 필요합니다 ...

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(); 
    } 
} 
+0

실제로 시스템 트레이 아이콘을 추가하는 코드를 제공 할 수 있습니까? – yglodt

+0

https://docs.oracle.com/javase/tutorial/uiswing/misc/systemtray.html 괜찮을 것입니다. – mangusbrother

+0

실제로 정확히 시도했지만 이상하게 SystemTray.isSupported()는 false를 반환합니다. 어떤 생각? (builder.headless (false)를 설정합니다.) 중요한 경우를 위해 – yglodt

0

누구 경우 :

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

실제로 나는 다음 한 아래와 같은 유형의 빈을 추가 한 시스템 아이콘을 추가하려면 솔루션 오히려 SpringApplication.run(MyConfig.class,args)를 사용하는 것보다,이다