Dove specificare i metadati relativi al trascinamento della selezione?

2

La struttura del nostro progetto separa strongmente le tre diverse parti:

  • core - classi di dati, POJO, talvolta aggregati con annotazioni (ad esempio per serializzazione XML / JSON)
  • plug-in : plug-in per una grande applicazione aziendale basata su Swing
  • ui - componenti UI aggiuntivi in JavaFX, utilizza solo le core classi di dati

Ora vogliamo implementare i trasferimenti drag-and-drop tra l'interfaccia utente in JavaFX e il plugin in Swing. Grazie ad una su StackOverflow , ci sono < strong> no altri problemi tecnici nell'implementazione.

Tuttavia, non so dove inserire la meta informazione su come le strutture di dati dovrebbero essere trasferite attraverso il sistema operativo. Per Swing, ho bisogno di definire (o riutilizzare) un DataFlavor , in JavaFX è richiesto un DataFormat . Entrambe queste classi si basano su una semplice stringa che dovrebbe / deve contenere un tipo MIME, ad es. text/plain o application/x-some-custom-data . Ma dove dovrebbe essere definito questo tipo di informazioni?

  1. Idea : memorizza il DataFormat / DataFlavor direttamente nella classe che lo utilizza, ad es. un controller:

    class MyController {
    
        public static final DataFormat FORMAT = new DataFormat("x-some-custom-data");
    
        // ...
            ClipboardContent content = new ClipboardContent();
            content.put(FORMAT, myDataObject);
        // ...
    }
    
    // equivalent for Swing part
    

    Svantaggio : le stesse informazioni devono essere archiviate in luoghi diversi.

  1. Idea : salva DataFormat / DataFlavor direttamente nella classe che viene trasferita:

    class MyDataClass {
    
        public static final DataFormat FORMAT = new DataFormat("x-some-custom-data");
    
        public static final DataFlavor FLAVOR = ...
    
        // some fields / getters / setters ...
    
    }
    
    // ...
        ClipboardContent content = new ClipboardContent();
        content.put(MyDataClass.FORMAT, myDataObject);
    // ...
    
    // equivalent for Swing part
    

    Svantaggio : le classi specifiche del framework vengono utilizzate all'interno di classi di dati puri (anche se appartengono al framework Java standard).

  1. Idea : memorizza le informazioni nella classe che viene trasferita, ma crea le classi specifiche del framework ( DataFormat / DataFlavor ) da qualche altra parte:

    @TransferAs("application/x-some-custom-data")
    class MyDataClass {
    
    }
    
    // ...
        DataFormat format = new DataFormat(myDataObject.getClass().getAnnotation(TransferAs.class).value());
    // ...
    
    // equivalent for Swing part
    

    Svantaggio : richiede un'annotazione personalizzata non standard che potrebbe creare confusione.

Quale idea considereresti la migliore pratica? C'è un altro approccio che mi manca totalmente in questo momento?

    
posta Lukas Körfer 23.08.2018 - 01:12
fonte

0 risposte

Leggi altre domande sui tag