2011-11-23 9 views
5

Sto utilizzando una versione leggermente modificata dell'esempio JTreeTable del Sole, supportata dal mio modello. Questo sarebbe il terzo esempio (segnalibri uno a http://java.sun.com/products/jfc/tsc/articles/bookmarks/).JTreeTable DnD Cursore a caduta lampeggiante pazzo

Tutto funziona come previsto tranne supporto drag and drop. Volevo DnD, che è più simile a ciò che fornisce un JTree. Dal momento che JTreeTable è un numero esteso JTable fornisce la classe JTable.DropLocation per determinare le posizioni di rilascio che non offrono informazioni sufficienti quando si rilasciano elementi nella colonna di rendering dell'albero di JTreeTable (nessun percorso e nessun indice secondario). Ho già risolto questo problema creando una classe personalizzata DropLocation basata su una combinazione di versioni JTable e JTree. Ho anche modificato il metodo paint della classe TreeTableCellRenderer che è fornita dall'implementazione JTreeTable menzionata per mostrare all'utente queste nuove informazioni (è ora in grado di vedere se il nuovo nodo verrà inserito all'interno, prima o dopo il nodo selezionato se all'interno della colonna ad albero, come ci si aspetterebbe da un JTree).

C'è un problema però. Il cursore del mouse sta diventando pazzo quando la posizione di rilascio viene sottoposta a rendering all'interno della colonna dell'albero. Appare e poi scompare dopo pochi millisecondi o questo accade così velocemente che il cursore di trascinamento non viene nemmeno mostrato. Questo succede anche con l'esempio del Sole non modificato. Sono completamente all'oscuro del perché questo sta accadendo. Ho trovato un'altra persona con lo stesso problema a http://www.java.net/node/663106, ma la soluzione fornita sembra impostare la posizione di rilascio del componente su null e non può essere più recuperata utilizzando il metodo JTreeTable.getDropLocation(). Ho bisogno di questo per convertirlo nel mio DropLocation modificato e quindi dipingere roba basata su di esso. Sono così vicino a una soluzione adeguata per il mio caso d'uso che posso assaggiarlo. Questa cosa lampeggiante del cursore è l'unico ostacolo sulla mia strada. Qualche idea?

Utilizzo di Java 1.6.

PS: Ho deciso per una consuetudine JTreeTable e non per uno dei componenti esistenti (come Netbeans Struttura o JXTreeTable) perché tutti sembrano essere affetti dal problema JTable.DropLocation e non offrono il supporto per far cadere prima o dopo il nodo dell'albero selezionato (solo all'interno). Se sei a conoscenza di un componente che fornisce tale funzionalità sarei lieto di saperlo.

+1

Nella fase di post scriptum di questa domanda che ho ingiustamente accuso '' org.netbeans.swing.Outline' e JXTreeTable' di non essere in grado di sostenere cadere prima o dopo il nodo della struttura selezionata . Questo non è vero in quanto questi componenti lo supportano. Entrambe indirettamente sottoclasse una JTable. Anche se è vero che 'JTable.DropLocation' non fornisce informazioni sul percorso, è sempre possibile ottenerlo attraverso la riga e la colonna della tabella fornite da esso. Se lo avessi saputo, non mi sarei mai preoccupato di arrotolare il mio componente. Io sconsiglio. – predi

risposta

7

che suona come una manifestazione del core bug #6700748 (non è possibile verificare, che maledetta parata di bug impiega anni per connettersi a ..). Quindi citando dalla correzione in JXTreeTable:

/** 
    * {@inheritDoc} <p> 
    * 
    * Overridden to hack around #766-swingx: cursor flickering in DnD 
    * when dragging over tree column. This is a core bug (#6700748) related 
    * to painting the rendering component on a CellRendererPane. A trick 
    * around is to let this return false. <p> 
    * 
    * This implementation applies the trick, that is returns false always. 
    * The hack can be disabled by setting the treeTable's client property 
    * DROP_HACK_FLAG_KEY to Boolean.FALSE. 
    * 
    */ 
    @Override 
    public boolean isVisible() { 
     return shouldApplyDropHack() ? false : super.isVisible(); 
    } 


    /** 
    * Returns a boolean indicating whether the drop hack should be applied. 
    * 
    * @return a boolean indicating whether the drop hack should be applied. 
    */ 
    protected boolean shouldApplyDropHack() { 
     return !Boolean.FALSE.equals(treeTable.getClientProperty(DROP_HACK_FLAG_KEY)); 
    } 
+0

Infatti. Questa è la risposta corretta. Sovrascrivere TreeTableCellRenderer.isVisible() per restituire sempre false fa il trucco. – predi