NetBeans Platform - come ottenere un callback quando una proprietà inizia / modifica estremità
-
04-10-2019 - |
Domanda
Nel mio dominio ho oggetti che vengono costantemente aggiornati da un processo separato, e voglio un PropertySheetView per visualizzare le proprietà cambiano. L'implementazione corrente è impostato in modo tale che il sottostante oggetto del modello di dominio è immutabile, e quindi quando cambia, c'è un nuovo oggetto pubblicato con un corrispondente ID. A quel punto, la mia Nodo avvolgendo l'oggetto ha sottoscritto, ottiene l'oggetto aggiornato con un ID di corrispondenza, e ricrea la scheda (via createSheet ()) e chiede setSheet con le informazioni aggiornate. Questo funziona bene a mostrare sempre la versione più recente del modello a oggetti di dominio.
Tuttavia, alcune delle proprietà non sono di sola lettura, ma invece può essere impostato. Desidero bloccare il foglio venga aggiornato / sovrascritto, su una riga o base foglio, mentre una proprietà viene modificato. Per fare questo ho bisogno di ascoltare le chiamate modificare di inizio e fine in modo da poter sapere quando è sicuro di aggiornare nuovamente il foglio.
Questo è fondamentale per la mia domanda; così com'è ora, non si può ottenere attraverso immettendo un nuovo valore prima che il foglio viene aggiornata e la modifica va via.
Se è importante, sto usando un custom PropertyEditorSupport, ma l'InplaceEditor di default.
Ho fatto un sacco di ricerca attraverso la sorgente di NetBeans e non vedo alcuna impostazione API esposte per ascoltare per questa roba.
SheetCellEditor (org.openide.explorer.propertysheet) espone un metodo addCellEditorListener, ma a) non riesco a capire come avrei ottenere una maniglia per l'istanza SheetCellEditor, e B) i metodi esposti da SheetCellEditor sono editingCanceled e editingStopped - non v'è alcuna callback per la modifica iniziata! Sembra molto stupido. Lo SheetTable e BaseTable esporrebbero questa proprietà anche, come si estendono JTable, ma non riesco a capire come ottenere una maniglia per loro neanche.
Ho notato che il CellEditor interfaccia richiede il metodo isCellEditable (), che restituisce presumibilmente vero se la cella può essere modificato, e quindi la modifica ha inizio. Ma ancora una volta, questo è implementato dalla SheetCellEditor che non è una classe pubblica, e non so come ottenere un riferimento ad esso.
Grazie per il vostro aiuto.
Soluzione
La soluzione migliore che potrei fornire è il seguente:
Crea un editor di proprietà personalizzata. Fare che editor di implementare InplaceEditor. Restituisce uno StringInplaceEditor che è un campo di testo. Collegare un ascoltatore attenzione a questo campo di testo. Quando focus è nel campo di testo, è in fase di modifica. In caso contrario, non lo è.