how to use view order in set style javafx? - css

i'm struggling with a vertical box i added a transition to, it stays at the back of the other nodes like label and imageview. i tried using toFront() but it didn't work. also i tried using .setStyle("-fx-view-order: [number]") but i was lost a bit in what the numbers represent exactly is it the order of nodes ascending or descending.
#1
vb.setStyle("-fx-view-order: 0");
img.setStyle("-fx-view-order: 1");
didn't work
#2
vb.setStyle("-fx-view-order: 1");
img.setStyle("-fx-view-order: 0");
didn't work

The easiest way to get a Node to render on top is to move it to the end of the child node list for its parent Node.
Note the documentation for -fx-view-order mentions: "The parent traverses its children in decreasing viewOrder order." To me that means higher view order is behind (drawn first) relative to lower view order. However, this is all relative to the parent node, not the Scene. Give us a reproducible example of what you are doing.
Also, what version of JavaFX are you using? -fx-view-order was not in JavaFX 8 (JDK 8)
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html#node

Related

In Graphic scene how to make overlapped object transparent?

In graphics view m setting scene in that adding objects (by dropping ), i can move these items by mouse, when i moved one object on another object moved object should be transparent. how can i make it?
I don't believe you actually want full transparency since it will make it impossible to visually recognize the transparent object later on. Reduced opacity - yes.
As for your question: each item inside your scene has a bounding rectangle (or other type of bounding area). You can easily get it by calling boundingRect() of your item. The returned QRectF has (just like QRect) has the bool QRect::intersects(const QRect &rectangle) const function, which takes another rectangle and checks if a collision is present.
Whenever you move your mouse while dragging an item you need to iterate either through all or just a subset of all items in your scene (by subset I mean just the items in a specific region to increase the performance) and check for collision. If a collision is detected, you can alter either the item you are dragging or the item underneath it.
Of course to make sure that one item covers another one you also need to check the Z value. The easiest way to do that is if you keep all currently not being dragged items at the same Z level and then, whenever you drag one, increase it's Z level by one so that it is "above" the others.

JavaFX: Two or more Panes at same Position

I have two Panes with populated nodes.
when I layout the panes side by side I can act on them and all works fine.
what I now want to do is, that I stack them at the same position, so that only one pane is visible. Similar nodes with the statement: node.toFront();
Is that possible?
M
Definitively is possible, you just need to use a StackPane, this component has the required behaviour by default. However, I would recommend you remove the first node before to add another one, just for performance reasons.

What is the meaning of "the item's view geometry and scene geometry will be maintained separately"?

The documentation for the QGraphicsItem::ItemIgnoresTransformations flag says
The item ignores inherited transformations (i.e., its position is still anchored to its parent, but the parent or view rotation, zoom or shear transformations are ignored). This flag is useful for keeping text label items horizontal and unscaled, so they will still be readable if the view is transformed. When set, the item's view geometry and scene geometry will be maintained separately. You must call deviceTransform() to map coordinates and detect collisions in the view. By default, this flag is disabled. This flag was introduced in Qt 4.3. Note: With this flag set you can still scale the item itself, and that scale transformation will influence the item's children.
Of course I have read the QGraphicsItem details, the QGraphicsScene details, the QGraphicsView details, and the Graphics View Framework.
There are also several questions about the ItemIgnoresTransformations flag like Fixed size QGraphicsItems in multiple views?
But I still do not understand the sentence in bold face. What does it mean ?
The problem that rose this concern is described in PyQt: Moving multiple items with different ItemIgnoresTransformations flags, but maybe this question was too long, or too pyqt oriented at first sight. And it was more about moving items. So here I'm trying to better focus.
Imagine situation that parent is rotated 45 degrees or even have some sheer. Since current item ignores this transformation it stays strait (not rotated).
Now ask question how this impacts on item size and position? Parent may maintain geometry of item (for example by using layout) but it doesn't take into account this flag, so some geometry (which is in parent units) will be set but effectively items scene rect may appear different since item ignores transformation and it is not rotated squeezed zoomed as a parent.
So from parent point of view geometry has some value but form scene point of view it is different.
It would be best if you try to see how it works in practice It is hard to describe problem clearly.

flex 4 - depth property not working as expected

I am developing an isometric game.
I have a parent UIComponent (WorldMap). The player can choose MapElement s (game items) and drop them in the playable area WorldMap. This MapElement also is a UIComponent which contains child controls such as Sprite, Image, Label and custom Flex components to hold various information.
Now, I have written a logic to determine which one should appear in back and which one should appear in front in the Isometric area which I am calling idx (index) and I am seeting this value to the depth property of the MapElement.
I have added three components in the order shown in below pic and I have set the depth property each of them as 11077,11168 and 10630. If the depth property worked properly the 3rd item should have gone behind the 1st item but it seems like they are appearing in the order of they have added (default behavior)
If I am not wrong the depth value can be anything
Can some one help me?
I am aware of another solution using swapChildren, swapChildrenAt and and also addChildAt methods (which I don't want to use for my project specific reason) but I need to find out whats wrong with the depth
The problem, as I think, in your WorldMap component which, as you said, is UIComponent. Diving deeper to depth property shows that depth setter launches invalidateLayering method, which is empty in UIComponent and overrides with logic only in Group which is main container for every Flex 4 component. And here's example:
http://www.tink.ws/blog/flex-4-uicomponent-depth/
So, it looks like, you need to use at least Group or SkinnableContainer as your WorldMap in order to achieve depth property to work correctly.
Use UIComponent.addChildAt(child:DisplayObject, index:int). addChildAt adds a child DisplayObject instance to this DisplayObjectContainer instance. The child is added at the index position specified. An index of 0 represents the back (bottom) of the display list for this DisplayObjectContainer object.

Prevent overlapping DragDrop Images in Flex

I am trying to create basically a puzzle in Flex Builder 3. I display images from an array onto a canvas that can be dragged and dropped around the canvas. My problem is that I don't want the images to be able to overlap each other. Any ideas on how to prevent this??
They can overlap as you drag but not when dropped, they need to "snap" to the nearest point that is not already occupied by another image.
I did something similar to this. What you do is onDrop add the target (x,x + object.width) and (y,y + object.height) to an array. Prior to this, if array is not null, check to see if your new object's x or y value is within an existing range in the array. If so, do not allow drop else allow the drop. All images, regardless of "picture" are square/rectangles so this would prevent the overlapping. However, if you have complex pictures (i.e. circles/hexagons) and are trying to butt the edges together, then this method will not work.

Resources