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