2015-06-15 7 views
10

मैंने हाल ही में स्विंग में अनुभव करने के बाद जावाएफएक्स एपीआई सीखना शुरू कर दिया है।जावाएफएक्स में पूर्ववत सुविधा क्यों नहीं है

मैंने देखा, कि एडब्ल्यूटी और स्विंग में भी कई कक्षाएं पहले से ही लागू की गई थीं, उन्हें प्रभावी रूप से जावाएफएक्स में फिर से कार्यान्वित किया गया था। इसमें शामिल हैं:

javafx.scene.paint.Color 
javafx.event.ActionEvent 

बनाम

java.awt.Color 
java.awt.event.ActionEvent 

और भी बहुत कुछ है, भले ही यह आसानी से उन्हें उपयोग करने के लिए आवश्यकता होती है सकते थे। मुझे लगता है कि यह है:

  • अन्य पुस्तकालयों से जावाफ़ैक्स को सबसे अधिक संभव घोषित करें (इसलिए नए डेवलपर्स को उनके अस्तित्व के बारे में भी पता नहीं होना चाहिए ..., ठीक है)।
  • लीवरेज जावा 8 लैम्ब्डा अभिव्यक्तियां।
  • जावा 5 जेनेरिक और एनम प्रकारों का उपयोग करें।
  • दिमाग में FXML के साथ डिज़ाइन।
  • बाइंडिंग ... जावाएफएक्स का जादू का संस्करण।

अगर मेरे मान्यताओं सत्य हैं, इसलिए वे का एक नया कार्यान्वयन शामिल नहीं किया था:

javax.swing.undo 

पैकेज?

हालांकि मैं समझता हूं कि पूर्ववत में उपयोगकर्ता इंटरफ़ेस के साथ वास्तव में कुछ भी नहीं है, इसलिए, स्विंग के साथ इसका कोई लेना-देना नहीं है। अगर किसी भी कारण से उन्होंने इसे javax.swing पैकेज में शामिल करने का निर्णय लिया, तो क्या वे इसे जावाएफएक्स में शामिल कर सकते थे।

+0

यह एक दिलचस्प सवाल है। बहुत से प्रयोज्यता लोग तर्क देंगे कि उपयोगकर्ता इंटरफेस के साथ पूर्ववत/फिर से करने का एक बड़ा सौदा है, क्योंकि उपयोगकर्ता यूआई की खोज के साथ काफी सहज है क्योंकि वह किसी भी फ़ंक्शन को अनदेखा कर सकता है। और javax.swing.undo के लिए दस्तावेज़ों को पढ़ने से यह स्पष्ट हो जाता है कि इसे स्वयं लागू करना तुच्छ से बहुत दूर है। – VGR

+3

आप [openjfx-dev मेलिंग सूची] (http://mail.openjdk.java.net/mailman/listinfo/openjfx-dev) से पूछना चाहेंगे। [UndoFX] (https://github.com/TomasMikula/UndoFX) JavaFX के साथ उपयोग के लिए डिज़ाइन किया गया एक तृतीय पक्ष ओपन सोर्स पूर्ववत फ्रेमवर्क विकल्प है। UndoFX का उपयोग [RichTextFX] (https://github.com/TomasMikula/RichTextFX) में किया जाता है, जो एक जावाएफएक्स आधारित टेक्स्ट एडिटर है। – jewelsea

+0

@jewelsea - आप उत्तर के रूप में क्यों नहीं डालते ?! – Deian

उत्तर

5

क्यों वे इसे लागू करने के लिए "भूल गए", यह एक अच्छा सवाल है। मैं तर्क दूंगा कि जावाएफएक्स अभी भी विकास में है (जो सब कुछ कहना चाहिए)। हालांकि, मुझे बहुत पहले इसकी आवश्यकता थी और मैंने कमांड पैटर्न का उपयोग करके अपना दृष्टिकोण लागू किया। जैसा कि नीचे दिखाया गया है, यह बहुत प्रयास और बहुत आसान नहीं है।

सबसे पहले आपको अपने आवेदन में कुछ संचालन निष्पादित करने के लिए कमांड नामक एक इंटरफेस बनाने की आवश्यकता होगी।

public interface Command { 
    /** 
    * This is called to execute the command from implementing class. 
    */ 
    public abstract void execute(); 

    /** 
    * This is called to undo last command. 
    */ 
    public abstract void undo(); 
} 

इसके बाद आप कुछ वर्ग इतिहास अपने निष्पादित आदेशों को बचाने के लिए और उन्हें पूर्ववत करने के लिए कहा जाता है की आवश्यकता होगी।

public final class History { 
    // ... 
    private static History instance = null; 
    private final Stack<Command> undoStack = new Stack<Command>(); 
    // ... 

    public void execute(final Command cmd) { 
     undoStack.push(cmd); 
     cmd.execute(); 
    } 

    public void undo() { 
     if (!undoStack.isEmpty()) { 
      Command cmd = undoStack.pop(); 
      cmd.undo(); 
     } else { 
      System.out.println("Nothing to undo."); 
     } 
    } 

    public static History getInstance() { 
     if (History.instance == null) { 
      synchronized (History.class) { 
       if (History.instance == null) { 
        History.instance = new History(); 
       } 
      } 
     } 
     return History.instance; 
    } 

    private History() { } 
} 

अपने FXML में आप तो जो आपके आवेदन की पूर्ववत समारोह आह्वान करना चाहिए अपने जीयूआई के लिए एक बटन पैदा करते हैं। अपने FXML में इस तरह के बाद एक के रूप में, एक बटन बनाने के लिए:

<Button fx:id="btnUndo" font="$x2" onAction="#onUndo" prefWidth="75.0" 
     text="Undo" textAlignment="CENTER" underline="false"> 
    <tooltip> 
     <Tooltip text="Undo last command" textAlignment="JUSTIFY" /> 
    </tooltip> 
    <HBox.margin> 
     <Insets left="5.0" right="5.0" fx:id="x1" /> 
    </HBox.margin> 
</Button> 

अपने नियंत्रक वर्ग में आप अपने FXML से बटन के संदर्भ हैं।

public class Controller { 
    // ... 
    @FXML private Button btnUndo; 
    // ... 

    @FXML 
    public void onUndo(ActionEvent event) 
    { 
     History.getInstance().undo(); 
    } 
} 

आप देख सकते हैं, सबसे अच्छी बात यह है कि इतिहास वर्ग एक सिंगलटन है। तो आप हर जगह से कक्षा तक पहुंच सकते हैं।

से विरासत इंटरफ़ेस एक नया आदेश लागू करने के लिए इंटरफ़ेस। नई कार्यक्षमता के लिए कुछ बटन या समान जीयूआई तत्वों का उपयोग करें और अपने इतिहास का उपयोग कर कस्टम कमांड निष्पादित करें।

// You can give arguments to command constructor if you like 
Command someCmd = new SomeCommand(); 
History.getInstance().execute(someCmd); // Saved to history; now you're able to undo using button 

इस दृष्टिकोण के साथ आप अपने ऑपरेशन को पूर्ववत कर पाएंगे। कुछ पुनः कार्यक्षमता को लागू करना भी संभव है। इसके लिए बस FXML में एक रेडो बटन जोड़ें और इतिहास कक्षा और कमांड इंटरफ़ेस में उचित विधि जोड़ें।

कमांड पैटर्न पर अधिक जानकारी के लिए, here देखें।

हैप्पी कोडिंग!

+0

अच्छा समाधान, लेकिन तकनीकी रूप से 'javax.swing.undo' अभी भी जावाएफएक्स पर लागू है। मैं इसके बजाय चिपके रहूंगा, क्योंकि यह अधिक मजबूत है। फिर भी मैं ऑफलाइन रिलीज में जावाफैक्स - अंडोएफ़एक्स के रूप में एक कार्यान्वयन विशेष होने की उम्मीद करता हूं। – Mordechai

+0

हां, यह एक अच्छा समाधान जैसा दिखता है ... लेकिन आपने वास्तव में मौजूदा 'swing.undo' पैकेज का उपयोग क्यों नहीं किया? स्विंग पैकेज अभी भी जावा के साथ बंडल किए गए हैं, तो क्या यह व्हील का पुनः आविष्कार करने का क्लासिक मामला नहीं है? या आपके पास एक और औचित्य है? –

संबंधित मुद्दे