2012-07-19 108 views
1


我有一个Java程序,就像裹在Apache共同守护进程(prunsrv),但一个窗口服务我有2个问题:
1.服务公司使用交互式桌面配置可以查看摆动对话框并尝试应用程序中的图标。但是,idalogs和try图标不会出现。
2.交互式桌面只适用于本地系统帐户应用程序无法读取当前登录的用户,此用户名对于应用程序是必需的Java作为Windows服务与交互式桌面支持和阅读CURREN登录用户

然后我需要解决这2个问题,谢谢,我粘贴代码从主类

package widget; 

import java.awt.AWTException; 
import java.awt.Image; 
import java.awt.Label; 
import java.awt.MenuItem; 
import java.awt.PopupMenu; 
import java.awt.SystemTray; 
import java.awt.Toolkit; 
import java.awt.TrayIcon; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowStateListener; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Properties; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

import widget.controller.NotifyManager; 
import widget.utils.Logger; 


public class AWidget extends JFrame { 
    private static Properties props = null; 
    private static String parametersFile = "widget.properties"; 
    public static String mediaResourcesPath; 
    public static String appIcon; 
    public static int updateFrecuency = 5; 

    String username = ""; 
    TrayIcon trayIcon; 
    SystemTray tray; 

    static String activityImages[]; 

    AWidget() { 
     super("Italo Widget"); 

     mediaResourcesPath = getParameter("mediaResourcesPath"); 
     appIcon = getParameter("appIcon"); 

     String val = getParameter("updateFrecuency"); 

     try { 
      updateFrecuency = Integer.parseInt(val); 
     } catch (NumberFormatException e) { 
      Logger.getTrace().debug("No se pudo leer la frecuencia de actualización de los mensajes"); 
     } 

     updateFrecuency *= 1000; 

     username = System.getProperty("user.name"); 
     username = "Javier"; 

     System.out.println("creating instance"); 
     try { 
      System.out.println("setting look and feel"); 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) { 
      System.out.println("Unable to set LookAndFeel"); 
     } 

     JPanel panel = new JPanel(); 

    panel.add(new Label("Usuario: " + username)); 

    add(panel); 

     Image image = Toolkit.getDefaultToolkit().getImage(mediaResourcesPath + "//" + appIcon); 

     if (SystemTray.isSupported()) { 
      System.out.println("system tray supported"); 
      tray = SystemTray.getSystemTray(); 

      ActionListener exitListener = new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Exiting...."); 
        System.exit(0); 
       } 
      }; 
      PopupMenu popup = new PopupMenu(); 
      MenuItem defaultItem = new MenuItem("Exit"); 
      defaultItem.addActionListener(exitListener); 
      popup.add(defaultItem); 
      defaultItem = new MenuItem("Open"); 
      defaultItem.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        setVisible(true); 
        setExtendedState(JFrame.NORMAL); 
       } 
      }); 
      popup.add(defaultItem); 

      trayIcon = new TrayIcon(image, "Tareas Italo", popup); 
      trayIcon.setImageAutoSize(true); 

     } else { 
      System.out.println("System tray not supported"); 
     } 
     addWindowStateListener(new WindowStateListener() { 
      public void windowStateChanged(WindowEvent e) { 
       if (e.getNewState() == ICONIFIED) { 
        try { 
         tray.add(trayIcon); 
         setVisible(false); 
         System.out.println("added to SystemTray"); 
        } catch (AWTException ex) { 
         System.out.println("unable to add to tray"); 
        } 
       } 
       if (e.getNewState() == 7) { 
        try { 
         tray.add(trayIcon); 
         setVisible(false); 
         System.out.println("added to SystemTray"); 
        } catch (AWTException ex) { 
         System.out.println("unable to add to system tray"); 
        } 
       } 
       if (e.getNewState() == MAXIMIZED_BOTH) { 
        tray.remove(trayIcon); 
        setVisible(true); 
        System.out.println("Tray icon removed"); 
       } 
       if (e.getNewState() == NORMAL) { 
        tray.remove(trayIcon); 
        setVisible(true); 
        System.out.println("Tray icon removed"); 
       } 
      } 
     }); 
     setIconImage(image); 

     try { 
      tray.add(trayIcon); 
      setVisible(false); 
      System.out.println("added to SystemTray"); 
     } catch (AWTException ex) { 
      System.out.println("unable to add to tray"); 
     } 

     setSize(300, 200); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void start(String[] args) { 
     File f = new File(""); 
     f = new File(f.getAbsolutePath() + "/conf/running.conf"); 
     f.delete(); 

     Logger.getTrace().debug("Iniciando"); 
     AWidget italoW = new AWidget(); 
     System.out.println("Instancia"); 

     new NotifyManager(italoW); 
    } 
    public static void stop(String[] args) { 
     try { 
      File f = new File(""); 
      f = new File(f.getAbsolutePath() + "/conf/running.conf"); 
      FileWriter fw = new FileWriter(f); 
      fw.append("false"); 
      fw.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     try { 
      if(args != null && args.length >0) { 
       if("stop".equals(args[0])) { 
        File f = new File(""); 
        f = new File(f.getAbsolutePath() + "/conf/running.conf"); 
        FileWriter fw = new FileWriter(f); 
        fw.append("false"); 
        fw.close(); 

       } else { 
        File f = new File(""); 
        f = new File(f.getAbsolutePath() + "/conf/running.conf"); 
        f.delete(); 
       } 
      } 
      Logger.getTrace().debug("Iniciando"); 
      AWidget italoW = new AWidget(); 
      System.out.println("Instancia"); 

      new NotifyManager(italoW); 

     } catch(Throwable th) { 
      Logger.getTrace().debug("ERROR:::" + th.getMessage()); 
     }   
    } 

    public void finish(){ 
     tray.remove(trayIcon); 
     dispose(); 
    }  
} 

感谢您的帮助。

+0

我想这一个是非常相似的问题,我昨天发布: - [http://stackoverflow.com/questions/11549881/java-service-wrapper-to-create-service-for-java-ui - 应用](http://stackoverflow.com/questions/11549881/java-service-wrapper-to-create-service-for-java-ui-application) – Rohan 2012-07-19 11:09:46

回答

6

默认情况下,Windows出于安全原因不允许服务与桌面进行交互。 您必须创建两个进程:一个用于唯一的服务部分(作为服务运行,不进行任何交互),另一个进程作为Windows应用程序标准运行。 并在它们之间建立沟通。

+0

是的,使用套接字通信来解决这个问题:),谢谢 – Buminda 2017-10-25 04:57:36

0

从什么我可以从你的问题,你有可能被你的代码重写从System.properties电话接收到一个静态字符串的用户名引起了第二个问题,在这里看到的理解:

username = System.getProperty("user.name"); 
username = "Javier"; //remove me 

至于你的其他问题,我会看看你使用的包装。我敢肯定,它有一些API。 (我还没有玩过服务......)。

相关问题