2012-10-03 16 views
15

Il colore picker JavaFX 2 ha un pulsante che apre un riquadro Color Chooser in questo modo:JavaFX riquadro popup 2 personalizzato

JavaFX 2 colour picker

mi piacerebbe fare qualcosa di simile, nel senso che mi piacerebbe un pannello personalizzato da far apparire quando si fa clic sul pulsante e scompare quando si fa clic su qualcos'altro (nel mio caso, alcune miniature di immagini). Quale sarebbe il modo migliore per raggiungere questo obiettivo? Dovrei usare un ContextMenu e aggiungere un pannello a un MenuItem in qualche modo, o c'è qualcos'altro che dovrei guardare?

risposta

23

È un po 'difficile fare bene con l'attuale API JavaFX 2.2.

Ecco alcune opzioni.


Utilizzare un MenuButton con un set grafico nella sua MenuItem

Questo è l'approccio adottato in s Button with popup showed below' eseguibile sample code.

wizpopup


Utilizzare un PopupControl

Date un'occhiata a come il ColorPicker fa questo nella sua code.

ColorPicker estende PopupControl. È possibile farlo, ma non tutte le API necessarie per creare il proprio PopupControl sono attualmente pubbliche. Quindi, per JavaFX 2.2, dovresti fare affidamento su classi com.sun interne che sono deprecate e saranno sostituite da classi pubbliche javafx.scene.control in JDK8.


Utilizzare un ContextMenu

Quindi, penso che la tua idea di "usare un ContextMenu e aggiungere un riquadro per un MenuItem" è probabilmente l'approccio migliore per ora. Dovresti essere in grado di farlo utilizzando uno CustomMenuItem o setting a graphic su un normale MenuItem. Il ContextMenu ha un bel relative positioning logic. Un ContextMenu può anche essere attivato da un MenuButton.


Utilizzare una finestra personalizzata

A tale scopo, visualizzare un palco trasparente, in una posizione relativa al nodo.

C'è un codice di esempio per iniziare che ho temporaneamente collegato here. Il codice di esempio esegue il posizionamento relativo ai lati della finestra principale, ma è possibile aggiornarlo per eseguire il posizionamento relativo ai lati di un determinato nodo (come il metodo show di ContextMenu).


Usare una lastra di vetro

Per fare questo, creare uno StackPane come radice della finestra principale. Posiziona il riquadro del contenuto principale come primo nodo nello StackPane e quindi crea un gruppo come secondo nodo nello stack, in modo che si sovrapponga alla parte superiore del contenuto principale. Normalmente, il gruppo principale non contiene nulla, ma quando vuoi mostrare il tuo popup, posizionalo nel gruppo in alto e traducilo in una posizione relativa al nodo appropriato nel tuo contenuto principale.

Si può vedere come i nodi di ancoraggio in this demo vengono utilizzati per vedere come questo potrebbe essere adattabile al contesto.


C'è un aggiornamento rilevante per questo per JavaFX8?

Non c'è molta differenza di pertinenza per Java 8, in generale le opzioni sono descritte in questo post in base alla funzionalità di Java 2.2. Java 8 aggiunge le funzionalità Dialog e Alert, ma quelle sono più mirate all'uso di finestre di dialogo con bordi, titoli e pulsanti piuttosto che il tipo di funzionalità desiderata nella domanda. Forse potresti essere in grado di iniziare dalla classe Dialog e di personalizzarlo molto per ottenere qualcosa di simile a ciò che è necessario, ma probabilmente stai meglio partendo da uno stage vuoto o PopupControl.

+0

Impressionante, buona panoramica, grazie! Sembra che manchi un sacco di cose fino a JavaFX8 ... tale è la vita. – berry120

+0

Puoi dare un esempio per 'Use a ContextMenu'? – TomJ

+0

Mi piacerebbe vedere un esempio con setManged (false) per un componente personalizzato con posizionamento manuale. – T3rm1