2013-01-31 22 views
6

पर जावाएफएक्स एफएक्सएमएल या जावाएफएक्स स्विंग एप्लिकेशन को छुपाने के लिए मैं वेबसाइट के लिए क्लाइंट ऐप विकसित करना चाहता हूं।सिस्टम ट्रे

मैं चाहता हूं कि ऐप कम से कम सिस्टम ट्रे में रहें।

मुझे नहीं पता कि यह कार्य कैसे पूरा किया जाए।

इस प्रकार के ऑपरेशन के लिए उनका कोई उदाहरण है।

+0

सही जवाब है [यहां] (http://stackoverflow.com/a/12571924/1624376) – Aubin

उत्तर

27

यहां कुंजी निहित निकास को झूठी Platform.setImplicitExit(false); पर सेट करना है, यह भी एक नए धागे में मंच को दिखाने और छिपाने के लिए महत्वपूर्ण है।

Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
     stage.show(); 
    } 
}); 

Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
     stage.hide(); 
    } 
}); 

इसके बाद, पूरे कोड:

import java.awt.AWTException; 
import java.awt.MenuItem; 
import java.awt.PopupMenu; 
import java.awt.SystemTray; 
import java.awt.TrayIcon; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import java.net.URL; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import javafx.stage.WindowEvent; 
import javax.imageio.ImageIO; 

/** 
* 
* @author alvaro 
*/ 
public class TrayTest extends Application { 

    private boolean firstTime; 
    private TrayIcon trayIcon; 


    public static void main(String[] args) 
    { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     createTrayIcon(stage); 
     firstTime = true; 
     Platform.setImplicitExit(false); 
     Scene scene = new Scene(new Group(), 800, 600); 
     stage.setScene(scene); 
     stage.show(); 

    } 

    public void createTrayIcon(final Stage stage) { 
     if (SystemTray.isSupported()) { 
      // get the SystemTray instance 
      SystemTray tray = SystemTray.getSystemTray(); 
      // load an image 
      java.awt.Image image = null; 
      try { 
       URL url = new URL("http://www.digitalphotoartistry.com/rose1.jpg"); 
       image = ImageIO.read(url); 
      } catch (IOException ex) { 
       System.out.println(ex); 
      } 


      stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
       @Override 
       public void handle(WindowEvent t) { 
        hide(stage); 
       } 
      }); 
      // create a action listener to listen for default action executed on the tray icon 
      final ActionListener closeListener = new ActionListener() { 
       @Override 
       public void actionPerformed(java.awt.event.ActionEvent e) { 
        System.exit(0); 
       } 
      }; 

      ActionListener showListener = new ActionListener() { 
       @Override 
       public void actionPerformed(java.awt.event.ActionEvent e) { 
        Platform.runLater(new Runnable() { 
         @Override 
         public void run() { 
          stage.show(); 
         } 
        }); 
       } 
      }; 
      // create a popup menu 
      PopupMenu popup = new PopupMenu(); 

      MenuItem showItem = new MenuItem("Show"); 
      showItem.addActionListener(showListener); 
      popup.add(showItem); 

      MenuItem closeItem = new MenuItem("Close"); 
      closeItem.addActionListener(closeListener); 
      popup.add(closeItem); 
      /// ... add other items 
      // construct a TrayIcon 
      trayIcon = new TrayIcon(image, "Title", popup); 
      // set the TrayIcon properties 
      trayIcon.addActionListener(showListener); 
      // ... 
      // add the tray image 
      try { 
       tray.add(trayIcon); 
      } catch (AWTException e) { 
       System.err.println(e); 
      } 
      // ... 
     } 
    } 

    public void showProgramIsMinimizedMsg() { 
     if (firstTime) { 
      trayIcon.displayMessage("Some message.", 
        "Some other message.", 
        TrayIcon.MessageType.INFO); 
      firstTime = false; 
     } 
    } 

    private void hide(final Stage stage) { 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       if (SystemTray.isSupported()) { 
        stage.hide(); 
        showProgramIsMinimizedMsg(); 
       } else { 
        System.exit(0); 
       } 
      } 
     }); 
    } 
} 
+2

यही वह था जो मैं ढूंढ रहा था .... महान उत्तर –

+0

जावाएफएक्स 8 पहले से ही बाहर है। अब एडब्ल्यूटी के बिना सिस्ट्रे का उपयोग करना संभव है? जावाएफएक्स बहुत अच्छा दिखता है। – qed

+0

यह ओएस एक्स पर मेरे लिए काम नहीं करता है। जब मैं ट्रे आइकन पर होवर करता हूं, तो यह लटकता है। – Ascherer

0

जहां तक ​​मुझे पता है कि यह जेएफएक्स 8 में संभव होगा। अभी सबसे अच्छा समाधान है कि आप अपने आवेदन को एडब्ल्यूटी में एम्बेड करें और एडब्ल्यूटी विंडो को छुपाएं।

+0

आप मुझे इस का काम कर उदाहरण दे सकते हैं टाइप करें जो आपने समझाया ... –

+1

@ अलस्कू का जवाब जो आपने समझाया था .. धन्यवाद –

+0

जावाएफएक्स 8 पहले से ही बाहर है। अब एडब्ल्यूटी के बिना सिस्ट्रे का उपयोग करना संभव है? जावाएफएक्स बहुत अच्छा दिखता है। – qed