Horizontally flipping a JTree - java

I want to visualize a set of linked objects by focusing on one element and showing all referenced objects and descendants in a tree to the right. That's business as usual.
But if i want to show the referencing objects (i.e. the objects pointing at my selected element) to the left of my selection i'd like to add a little twist. I want it to be a "reverse tree" - a tree with the structure nodes and lines on the right side.
That way the selected element (as root node) would be in the middle of the two trees and at least in theory it would be less confusing to the user.
Is there a way to flip the tree structure (not the text of course) horizontally in a JTree?

I'm pretty confident that there isn't an easy solution.
Probably the best you can do is, dig into the paint/repaint method of the tree until you find the place where the actual drawing is happening. Then create a tree with your own implementation of that.
Beware that you have to do the same thing for any kind of event handling, in order to find the correct node that was clicked on.

maybe you have look at JTreeTable,

It seems like you have to implement the TreeCellRenderer interface and make your own realization of getTreeCellRendererComponent and paint methods.
Excuse me for short answer and maybe wrong even. It just a small hint.

Related

JTree representing a graph

I am using the JTree Swing utility to represent a Tree that actually have loops. I have a single node called root, but some of the children will eventually point back to other parts of the tree, thus not making it a true tree, but rather a graph.
My Java application keeps locking up, (no exceptions being thrown, no stack overflow... etc) when I try to use the little gray arrows to expand and contract parts of the graph.
My question is, does JTree require that none of the DefaulMutableTreeNodes not contain a loop?
If so, how do we represent something like that using a JTree utility. For example, when you are debugging an application say in eclipse, and you can infinitely use the variable tree in debug mode to keep on looking through a looped object. That is the behavior I am looking for.
Any suggestions?
I don't think it's a problem that nodes in a Jtree loop on themselves. Apparently you have a problem only with an "expand all" button, which makes sense because an expand all method will go recursively through the nodes until they have no sons.
Jtree does not have an expand all button by default, so I'm guessing yours is already customized...? My suggestion would be either remove the button, or customize the code to stop the expansion if findind a node that was already expanded higher in the hierarchy.

Find location of a Jtree icon

Here's my problem. I want the pop up dialog to be triggered when a use clicks on the icon and icon only of a jtree tree node. I did some research and did not find any existing way to add mouse listeners on the icon (if there is please let me know!). Therefore, I decided to hack my way into it and use the Point object which I can get form mouseevent.getPoint() to figure out whether the mouse is on the icon. However, when I call Jtree.getCellRenct(row, col, includespacing) the location I get seem to be relative to the indentation of children node.
For example,
Parent
-Child1
-Child2
I get the same x coordinate by calling getCellRect() on all three nodes although what I really want is the x plus the indentation caused by "-" because mouseevent.getpoint() is not relative to the indentation.
Any idea how I can do this?
Edit:
I figured out a way. I call tree.getUI to get a BasicTreeUI object and call BasicTreeUI.getLeftChildIndent() and BasicTreeUI.getRightChildIndent(). Summing up these two integers will be the total indentation per level of the tree (or it seems to be so far). So I calculate the indentation by
(path.getPathCount() - 1) * (leftindent + rightindent).
It works for me so far although I am not entirely sure if this is good. For example I don't really know what left and right indent mean. Also in the source of BasicTreeUI it actually has a protected method
protected int getRowX(int row, int depth)
{
return totalChildIndent * (depth + depthOffset);
}
This method seems to get called by another protected method used to check if a location is within the area of tree expansion or collapse icon. I couldn't figure out much about what depthOffset is for. I guess it has something to do with whether root gets displayed or things of similar nature.
But still I am not feeling very comfortable doing it this way.. could somebody either tell me I'm good or that there is a better way to do this? :-)

Visualizing multiple layouts in jung

I am creating a RadialTreeLayout of a graph using JUNG. Now I want to see one more RadialTreeLayout of another graph (with same type of vertices and edges) as a part of the main layout.
The problem is not of uniting the two graphs (as explained here) but actually of visualizing a similar layout in the main window.
Few ways I thought of doing that, but not sure if they are feasible or not. e.g. to create one such node which actually is the layout (and can be seen with zooming in) or when one clicks on that node, another layout appears in a separate window.
Or are there existing ways to do that in JUNG already. Any help/suggestions would be appreciated.
Check out the demos. I don't remember offhand which one, but at least one demonstrates visualization of multiple graphs.

JTree selection color

I'm using a JTree in my application. If I select a leaf node in most of the cases they are displayed with blue background (which is fine). But for some reason in some cases they do not get a blue background (though the event handling for choosing this leaf node works). I don't have a clue what could be the problem here... If I expand or collapse a branch node after the selection (with the little icon in front of a branch node), the selection becomes visible. I'm pretty confused by this behaviour.
Any idea where to start digging into this problem?
JTree uses (unless you changed the L&F) the BasicTreeUI which in turn will use the DefaultTreeCellRenderer. If you look at the method getTreeCellRendererComponent this might help you. If it's easy to replicate this issue some debugging into this method might reveal the cause.

Is there a way to have expander icons for multiple roots in a JTree?

I have a JTree with multiple "roots" (Of course, I actually have an invisible real root with multiple children).
The nodes expand and collapse on double click, but there's no visual indication that you can do this as there is no expander icon.
This is made worse by the fact that the tree is collapsed by default, but expanding the "roots" doesn't really help, as each has many children and it would look cluttered.
Is there a way to display the expander icons without making the real (and utterly valueless) root visible?
Any other suggestions to make the display clearer welcome.
Would tree.setShowsRootHandles(true) be a good way to display those "expander icons" ?
A tree typically also performs some look-and-feel-specific painting to indicate relationships between nodes. You can customize this painting in a limited way.
First, you can use tree.setRootVisible(true) to show the root node or tree.setRootVisible(false) to hide it.
Second, you can use tree.setShowsRootHandles(true) to request that a tree's top-level nodes — the root node (if it is visible) or its children (if not) — have handles that let them be expanded or collapsed.
Check also your look and feel to be sure what the renderer does with your tree.

Categories