次のような整数の次の 3 つのセットがあります。
set0 = {1} //this will always be a singleton set.
set1 = {2, 3, 4, 5}
set2 = {6, 7}
set1 から set2 または set2 から set3 のいずれかのエッジを持つグラフがあるため、明確なツリーのような頂点の階層が形成されます。
Set0 -- Set1 -- Set2
このツリー状のグラフを表示するために、DelegateForest
とを作成しました。TreeLayout
package Test;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JPanel;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.algorithms.layout.TreeLayout;
import edu.uci.ics.jung.graph.DelegateForest;
import edu.uci.ics.jung.graph.Forest;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
class Main{
public static void main(String[] args){
Set<Integer> set0 = new HashSet<Integer>();
Set<Integer> set1 = new HashSet<Integer>();
Set<Integer> set2 = new HashSet<Integer>();
set0.add(1);
set1.add(2);
set1.add(3);
set1.add(4);
set1.add(5);
set2.add(6);
set2.add(7);
JFrame frame = new JFrame();
frame.add(createGraphPanel(set0, set1, set2));
frame.pack();
frame.setVisible(true);
}
private static JPanel createGraphPanel( Set<Integer> setZero, Set<Integer> firstSet, Set<Integer> secondSet) {
// create a graph
Graph<Integer, String> graph = new DelegateForest<Integer, String>();
Integer vertex1 = setZero.iterator().next();
for (Integer i : firstSet) {
graph.addEdge(vertex1+"-"+i, vertex1, i);
}
Layout<Integer, String> layout = new TreeLayout<Integer, String>((Forest<Integer, String>) graph);
VisualizationViewer<Integer, String> vv = new VisualizationViewer<Integer,String>(layout);
vv.getRenderContext().setVertexLabelTransformer(
new ToStringLabeller<Integer>());
return vv;
}
}
しかし、私が得たグラフ(現在、set1とset2のみを含む)は次のようになります
このグラフに対していくつかのことをしたいと思います。
- ノードが上から下に流れるのではなく、左から右に流れるようにしたいと思います。(90度回転させるようなもの)
- 現在、レイアウト アルゴリズムはオーバーラップがないことを確認し、set2 のノードを直線的に広げます。set2 が巨大な場合、パネルの境界を超えてしまいます。オーバーラップは気にせず、これらのノードがクラスターとして近くに表示され、部分的なオーバーラップが許可されることを望みます。
どうすれば2つの要件を達成できますか?