2012-10-03 37 views
15

El selector de color JavaFX 2 tiene un botón que aparece un panel selector de color, así:JavaFX emergente del panel de 2 personalizada

JavaFX 2 colour picker

me gustaría hacer algo similar, en el que me gustaría un panel personalizado que aparece cuando se hace clic en el botón y desaparece cuando se hace clic en otra cosa (en mi caso, algunas miniaturas de imágenes). ¿Cuál sería la mejor manera de lograr esto? ¿Debo usar un ContextMenu y agregar un panel a un MenuItem de alguna manera, o hay algo más que debería ver?

Respuesta

23

Es un poco difícil hacerlo bien con la API actual de JavaFX 2.2.

Aquí hay algunas opciones.


Utilice un MenuButton con un conjunto gráfico en que es Menultem

Este es el enfoque adoptado en Button with popup showed below 's ejecutable sample code.

wizpopup


Use un PopupControl

Tome un vistazo a cómo ColorPicker hace esto de que es code.

ColorPicker extiende PopupControl. Puedes hacer esto, pero no toda la API requerida para construir tu propio PopupControl es actualmente pública. Por lo tanto, para JavaFX 2.2, debe confiar en las clases com.sun internas que están en desuso y serán reemplazadas por las clases públicas javafx.scene.control en JDK8.


Utilice un ContextMenu

Por lo tanto, creo que su idea de "usar un ContextMenu y añadir un panel a un Menultem" es probablemente el mejor enfoque por ahora. Debería poder hacer esto usando CustomMenuItem o setting a graphic en un MenuItem normal. El ContextMenu tiene un buen relative positioning logic. Un ContextMenu también puede ser activado por un MenuButton.


Utilice un cuadro de diálogo personalizado

Para ello, mostrar un escenario transparente a una ubicación en relación con el nodo.

Hay un código de muestra para empezar que he vinculado temporalmente here. El código de ejemplo realiza un posicionamiento relativo a los lados de la ventana principal, pero puede actualizarlo para realizar un posicionamiento relativo a los lados de un nodo determinado (como el método de presentación ContextMenu).


uso de un cristal

Para ello, cree un StackPane como su raíz de su ventana principal. Coloque su panel de contenido principal como el primer nodo en el StackPane y luego cree un grupo como el segundo nodo en el panel de distribución, de modo que se superponga sobre el contenido principal. Normalmente, el grupo superior no contiene nada, pero cuando desea mostrar su ventana emergente, colóquelo en el grupo superior y tradúzcalo a una ubicación relativa al nodo apropiado en su contenido principal.

Puede ver cómo se utilizan los nodos de anclaje en this demo para ver cómo esto puede adaptarse a su contexto.


¿Hay una actualización pertinente para esto durante JavaFX8?

No hay mucha diferencia de relevancia para Java 8, en general las opciones se describen en esta publicación basada en la funcionalidad de Java 2.2. Java 8 agrega las funcionalidades Dialog y Alert, pero están más dirigidas al uso de cuadros de diálogo con bordes, títulos y botones, en lugar del tipo de funcionalidad deseada en la pregunta. Tal vez pueda comenzar desde la clase Dialog y personalizarla en gran medida para obtener algo parecido a lo que se necesita, pero es mejor que empiece desde una etapa en blanco o PopupControl en su lugar.

+0

Impresionante, buena visión general, ¡gracias por eso! Parece que faltan muchas cosas hasta JavaFX8 ... tal es la vida. – berry120

+0

¿Puedes dar un ejemplo para 'Usar un menú contextual'? – TomJ

+0

Me gustaría ver un ejemplo con setManged (falso) para un componente personalizado con posicionamiento manual. – T3rm1