2012-09-24 14 views
16

मैं JavaFX यूआई का उपयोग कर एक सरल अनुप्रयोग बनाना रहा हूँ, एप्लिकेशन बस बस यही काम:JavaFX एप्लिकेशन

  • एक systray आइकन है, जो जब क्लिक एक खिड़की, जब फिर से क्लिक किया यह खाल से पता चलता है, पर rightclick 1 'प्रस्थान' आइटम

मैं पहले से ही यूआई बनाया और Sys ट्रे में ऐप डाल के साथ एक मेनू से पता चलता है, लेकिन मैं इसे छिपाने नहीं दिखा सकते हैं/सामान्य ActionListener विधि का उपयोग कर, लेकिन मैं यह त्रुटि आई:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0 

यहाँ कोड है:

import java.awt.Image; 
import java.awt.MenuItem; 
import java.awt.PopupMenu; 
import java.awt.SystemTray; 
import java.awt.Toolkit; 
import java.awt.TrayIcon; 
import java.awt.event.ActionListener; 


import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class Main extends Application{ 
    public static void main(String[] args) { 
     launch(args);  
    } 

    @Override 
    public void start(final Stage primaryStage) { 
     primaryStage.setTitle("Hello World!"); 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!");   } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 

     if (SystemTray.isSupported()) {   
      SystemTray tray = SystemTray.getSystemTray(); 
      Image image = Toolkit.getDefaultToolkit().getImage("Germany-politcal-map.jpg"); 
      PopupMenu popup = new PopupMenu(); 
      MenuItem item = new MenuItem("Exit"); 

      popup.add(item); 

      TrayIcon trayIcon = new TrayIcon(image, "Amr_Trial", popup); 

      ActionListener listener = new ActionListener() {     
       @Override 
       public void actionPerformed(java.awt.event.ActionEvent arg0) { 
        // TODO Auto-generated method stub 
        System.exit(0);     
       }    
      };      

      ActionListener listenerTray = new ActionListener() {     
       @Override 
       public void actionPerformed(java.awt.event.ActionEvent arg0) { 
        // TODO Auto-generated method stub     
        primaryStage.hide(); 
       }     
      };    

      trayIcon.addActionListener(listenerTray); 
      item.addActionListener(listener); 

      try{ 
       tray.add(trayIcon); 
      }catch (Exception e) { 
       System.err.println("Can't add to tray"); 
      } 
      } else { 
      System.err.println("Tray unavailable"); 
      } 
     // 
    } 
} 

उत्तर

19

लपेटें ActionListener जो Platform.runLater में वापस JavaFX करने के लिए कॉल में कोड। यह कोड को निष्पादित करेगा जो जावाएफएक्स सिस्टम के साथ जावाफैक्स सिस्टम थ्रेड पर इंटरफेस करता है, स्विंग इवेंट थ्रेड (जो आपको समस्याएं पैदा कर रहा है) पर करने की कोशिश करने के बजाए।

उदाहरण के लिए:

ActionListener listenerTray = new ActionListener() {     
    @Override public void actionPerformed(java.awt.event.ActionEvent event) { 
    Platform.runLater(new Runnable() { 
     @Override public void run() { 
     primaryStage.hide(); 
     } 
    }); 
    }     
};    

डिफ़ॉल्ट रूप से आवेदन shutdown when it's last window is hidden होगा। इस डिफ़ॉल्ट व्यवहार को ओवरराइड करने के लिए, पहले एप्लिकेशन चरण दिखाने से पहले Platform.setImplicitExit(false) पर जाएं। आपको तुरंत Platform.exit() पर कॉल करने की आवश्यकता होगी जब आपको वास्तव में बंद करने के लिए एप्लिकेशन की आवश्यकता होगी।


मैंने demo for using the AWT system tray within a JavaFX application बनाया।

+0

हाँ में जारी हो सकता है, मैं सिर्फ इतना है कि प्रलेखन पेज में, THX बहुत मिल गया। लेकिन जब मैं इसे छुपाता हूं, तो मैं फिर से दिखाई नहीं देता हूं, भले ही मैं शो() – amrlab

+0

का उपयोग करता हूं, स्पष्ट/स्पष्ट निकास व्यवहार को समझाने के लिए अद्यतन उत्तर। – jewelsea

+0

वास्तव में, Thx बहुत, मैं इसके लिए बहुत कुछ खोज रहा था !! – amrlab

4

आप केवल JavaFX धागे पर JavaFX वर्गों को संशोधित करना चाहिए, ट्रे आइकन पर श्रोताओं स्विंग धागा पर चल रहे होने की संभावना है। तुम इतनी तरह प्लेटफार्म # runLater करने के लिए एक runnable पोस्ट करके ऐसा कर सकते हैं:

Platform.runLater(new Runnable() { 
    public void run() { 
     primaryStage.hide(); 
    } 
}); 
1

सिस्टम ट्रे अभी तक जावाएफएक्स में समर्थित नहीं है। आप निम्न जिरा मुद्दे के तहत इस कार्य पर प्रगति को ट्रैक कर सकते हैं: https://bugs.openjdk.java.net/browse/JDK-8090475
यह समस्या एक वर्कअराउंड भी प्रदान करती है, जिसका उपयोग मूल समर्थन प्राप्त करने के लिए जावाएफएक्स 8 में किया जा सकता है।

सुविधा JavaFX 8 के लिए योजना नहीं है, इसलिए यह निम्नलिखित अद्यतन में से एक में या यहाँ तक कि JavaFX 9.

+4

पंजीकरण के बिना जिरा सामग्री देखना अच्छा लगेगा। – aphex

+1

सुविधा ट्रैकिंग अब यहां है: https://bugs.openjdk.java.net/browse/JDK-8092115 –