Just because I wanted to make minimal changes to your code, which was
already using StackPane. Yes, Popup would remove the need for a
StackPane.

On Tue, Jun 10, 2014 at 3:52 PM, Tom Eugelink <t...@tbee.org> wrote:
>
> You're way ahead of me. Why use stackpane and not popup as suggested?
> Wouldn't Popup remove the need for a stackpane?
>
> Tom
>
>
>
>
> On 2014-6-10 15:38, Tomas Mikula wrote:
>>
>> Since talk is cheap, I slightly reworked your code (not using
>> PopupWindow) and it seems to work.
>>
>> CircularPopupMenu:
>>
>> https://github.com/TomasMikula/jfxtras-labs/blob/8.0/src/main/java/jfxtras/labs/scene/menu/CirclePopupMenu1.java
>>
>> Sample:
>>
>> https://github.com/TomasMikula/jfxtras-labs/blob/8.0/src/main/java/jfxtras/labs/scene/menu/Sample1.java
>>
>> Main points:
>> * No "canvas" pane used, CircularPane is added directly to the stack pane.
>> * CircularPane is added as the last child to the stack pane in order
>> to be on top.
>> * CircularPane is an "unmanaged" child of the stack pane, in order to
>> allow custom positioning (at mouse pointer)
>> * Since setPickOnBounds(false) causes the mouse exit the circular pane
>> as soon as it opens, there's slightly more logic to hide the menu
>> instead of just listening to MOUSE_EXITED events:
>>
>>      stackPane.addEventHandler(MouseEvent.MOUSE_MOVED, e -> {
>>         if(isShown()) {
>>             Bounds localBounds = circularPane.getBoundsInLocal();
>>             Bounds screenBounds = circularPane.localToScreen(localBounds);
>>             if(!screenBounds.contains(e.getScreenX(), e.getScreenY())) {
>>                 hide();
>>             }
>>         }
>>      });
>>
>> Cheers,
>> Tomas
>>
>> On Tue, Jun 10, 2014 at 1:45 PM, Tomas Mikula <tomas.mik...@gmail.com>
>> wrote:
>>>
>>> What about using Popup, which is a subclass of PopupWindow? You just need
>>> to
>>> populate its content
>>>
>>>      popup.getContent().addAll(Node...);
>>>
>>> and then show it at the right position, relative to any node
>>>
>>>      popup.show(canvas, x, y);
>>>
>>> Tomas
>>>
>>> On Jun 10, 2014 8:49 AM, "Tom Eugelink" <t...@tbee.org> wrote:
>>>>
>>>>
>>>> Looking at PopupWindow; that is an abstract class and I'm not finding
>>>> much
>>>> examples on how to use it. Maybe extending PopupControl would be a
>>>> better
>>>> choice.
>>>>
>>>> Been looking at the ContextMenu source code (which is extending
>>>> PopupControl), but it is somewhat mysterious how those MenuItems get
>>>> rendered. I would expect maybe a skin, but I'm not finding it.
>>>>
>>>>
>>>> On 2014-6-9 13:48, Tomas Mikula wrote:
>>>>>
>>>>> Hi Tom,
>>>>>
>>>>> I am in favor of the menu being a PopupWindow, but alternatively,
>>>>> could your "canvas" be a Group instead of a Pane?
>>>>>
>>>>> The code would look like this:
>>>>>
>>>>>       StackPane stack = new StackPane();
>>>>>
>>>>>       Group canvas = new Group();
>>>>>       canvas.setManaged(false);
>>>>>
>>>>>       stack.setOnMousePressed(e -> {
>>>>>           // layout in the top left corner of the stack pane
>>>>>           canvas.setLayoutX(0);
>>>>>           canvas.setLayoutY(0);
>>>>>
>>>>>           stack.getChildren().add(canvas);
>>>>>       });
>>>>>
>>>>> Regards,
>>>>> Tomas
>>>>>
>>>>> On Mon, Jun 9, 2014 at 11:01 AM, Tom Eugelink <t...@tbee.org> wrote:
>>>>>>
>>>>>> But a PopupWindow would be detached from the pane? Not sure if that is
>>>>>> what
>>>>>> I envision, but I'll give it a go and see what it looks like.
>>>>>>
>>>>>> Your event filter does work though for what I need now.
>>>>>>
>>>>>> Thanks!
>>>>>>
>>>>>>
>>>>>> On 2014-6-9 10:41, Martin Sladecek wrote:
>>>>>>>
>>>>>>> Oh, I see. So it's not a PopupWindow at all.
>>>>>>> Events can pass only though parent-child hierarchy, so you can't
>>>>>>> catch
>>>>>>> an
>>>>>>> Event in your "circular menu" pane and then pass it to some other
>>>>>>> children
>>>>>>> of the parent StackPane. The menu pane would have to be parent of the
>>>>>>> controls in the StackPane.
>>>>>>> So again, you'd need RT-20184 to determine the target again by
>>>>>>> temporarily
>>>>>>> making the menu pane mouse transparent, doing Scene.pick and then
>>>>>>> redirecting the Event by Event.fireEvent().
>>>>>>>
>>>>>>> But I think reworking you menu to be a PopupWindow should work. The
>>>>>>> transparent areas in the circular menu should pass mouse events to
>>>>>>> the
>>>>>>> underlying window.
>>>>>>>
>>>>>>> -Martin
>>>>>>>
>>>>>>> On 06/09/2014 10:20 AM, Tom Eugelink wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> Or to see in in action with a single java -jar statement, download
>>>>>>>> the
>>>>>>>> samples from.
>>>>>>>> http://jfxtras.org/
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On 2014-6-9 10:13, Martin Sladecek wrote:
>>>>>>>>>
>>>>>>>>> OK, so to avoid further confusion, you have a PopupWindow with a
>>>>>>>>> Pane
>>>>>>>>> and you want to capture Events on the Pane and sent those events to
>>>>>>>>> the
>>>>>>>>> underlying controls (in a parent window) if those events are not
>>>>>>>>> relevant to
>>>>>>>>> that popup?
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> -Martin
>>>>>>>>>
>>>>>>>>> On 06/09/2014 10:07 AM, Tom Eugelink wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Hm, maybe I chose bad words; I'm not using Canvas, but just a
>>>>>>>>>> Pane.
>>>>>>>>>> Since the Pane is only used to draw the menu on when it need to
>>>>>>>>>> appear, I'm
>>>>>>>>>> calling it the canvas pane, as in "what is painted on".
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 2014-6-9 9:46, Martin Sladecek wrote:
>>>>>>>>>>>
>>>>>>>>>>> Just looked at the code and it seems Canvas does pick on bounds
>>>>>>>>>>> independently of the pickOnBounds value. There's currently no
>>>>>>>>>>> logic
>>>>>>>>>>> for
>>>>>>>>>>> picking only when over an opaque pixel ( worth filing a JIRA
>>>>>>>>>>> issue
>>>>>>>>>>> maybe?).
>>>>>>>>>>> This makes Canvas to consume everything as it's always picked
>>>>>>>>>>> instead of
>>>>>>>>>>> some controls underneath.
>>>>>>>>>>>
>>>>>>>>>>> Unfortunately, I can't think of any solution that would work
>>>>>>>>>>> right
>>>>>>>>>>> now. If we'd support Node picking
>>>>>>>>>>> (https://javafx-jira.kenai.com/browse/RT-20184), it would be
>>>>>>>>>>> possible to
>>>>>>>>>>> "redirect" an unwanted event to a different event target on that
>>>>>>>>>>> mouse
>>>>>>>>>>> position.
>>>>>>>>>>>
>>>>>>>>>>> -Martin
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On 06/09/2014 08:44 AM, Tom Eugelink wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Yessss. It does not work on the canvas pane, I suspect because
>>>>>>>>>>>> of
>>>>>>>>>>>> the
>>>>>>>>>>>> pickOnBounds, but it does work on the stackpane. Plus, I can
>>>>>>>>>>>> register to the
>>>>>>>>>>>> stack pane without claiming the onMouseClick/Press hook.
>>>>>>>>>>>>
>>>>>>>>>>>> Many thanks!
>>>>>>>>>>>>
>>>>>>>>>>>> Tom
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On 2014-6-9 8:29, Martin Sladecek wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>> Hi Tom,
>>>>>>>>>>>>> have you tried .addEventFilter() method? It receives the Event
>>>>>>>>>>>>> before the controls underneath the canvas, in the capturing
>>>>>>>>>>>>> phase. If you
>>>>>>>>>>>>> don't consume the Event, it should pass down to the controls.
>>>>>>>>>>>>> For more on the topic, see
>>>>>>>>>>>>> http://docs.oracle.com/javafx/2/events/processing.htm or
>>>>>>>>>>>>> http://parleys.com/play/514892290364bc17fc56c39f
>>>>>>>>>>>>>
>>>>>>>>>>>>> -Martin
>>>>>>>>>>>>>
>>>>>>>>>>>>> On 06/09/2014 08:19 AM, Tom Eugelink wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Maybe someone has solved this already, so I thought I pop the
>>>>>>>>>>>>>> question. Currently I'm working on CirclePopupMenu; a menu
>>>>>>>>>>>>>> that
>>>>>>>>>>>>>> is supposed
>>>>>>>>>>>>>> to pop up on any place in a scene when a certain (usually the
>>>>>>>>>>>>>> middle or
>>>>>>>>>>>>>> right) mouse button is pressed.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Right now CirclePopupMenu requires a stackpane to which it
>>>>>>>>>>>>>> binds
>>>>>>>>>>>>>> itself. CirclePopupMenu initially places an empty "canvas"
>>>>>>>>>>>>>> Pane
>>>>>>>>>>>>>> on the stack
>>>>>>>>>>>>>> pane, and will use that to render and position the menu when
>>>>>>>>>>>>>> it
>>>>>>>>>>>>>> needs to
>>>>>>>>>>>>>> appear.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Also I need to monitor the mouse to detect if the menu should
>>>>>>>>>>>>>> appear. In order to do that, I would like to use that canvas
>>>>>>>>>>>>>> pane, but then
>>>>>>>>>>>>>> any non relevant button clicks will not reach the underlying
>>>>>>>>>>>>>> controls. In
>>>>>>>>>>>>>> order to enable correct behavior I need to
>>>>>>>>>>>>>> setPickOnBounds(false) on the
>>>>>>>>>>>>>> pane, but then it does receive the mouse events anymore.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Is there any way to monitor mouse events but still pass them
>>>>>>>>>>>>>> through to the underlying controls? In Swing I did something
>>>>>>>>>>>>>> similar and
>>>>>>>>>>>>>> used a system level mouse event hook.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Tom
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> PS: I'm not certain if the stackpane approach I've used is the
>>>>>>>>>>>>>> best
>>>>>>>>>>>>>> way to do this. It does work expect the mouse button problem.
>>>>>>>>>>>>>> But any
>>>>>>>>>>>>>> suggestions are welcome.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>
>
>

Reply via email to