[英]Multiple views on same graph with different styles
我正在嘗試比較社區檢測算法的輸出,並且我想進行並排比較。 這個想法是,我將有兩個 windows 顯示相同的圖形布局,並且我根據所選的 output 為節點和邊緣着色。 一個簡單的例子是這樣的:
我能夠生成圖形並創建視圖,但我沒有發現如何在 Graphstream 中為兩個圖形強制使用相同的圖形布局或基於 Graphstream 視圖分配不同的 UI 屬性。
這個事情誰有經驗?
在一個玩具示例中,我似乎得到了類似的結果,盡管不一樣。 問題開始了,一旦我使用了數千個節點,似乎布局就完全不同了。 不幸的是,我無法為這種情況提供數據集。 這是一個更大數據的示例:
兩個圖都有相同的布局管理器(SpringBox)並使用相同的數據。
我正在使用 Java 8、Graphstream 2.0 和 Swing
編輯:我發現,可以將Random
作為種子傳遞給Layout
,但不幸的是它不會產生相同的圖表。
import org.graphstream.graph.Element;
import org.graphstream.graph.Graph;
import org.graphstream.graph.implementations.DefaultGraph;
import org.graphstream.ui.layout.springbox.implementations.SpringBox;
import org.graphstream.ui.swing.SwingGraphRenderer;
import org.graphstream.ui.swing_viewer.DefaultView;
import org.graphstream.ui.swing_viewer.SwingViewer;
import org.graphstream.ui.swing_viewer.ViewPanel;
import org.graphstream.ui.view.Viewer;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Main main = new Main();
SwingUtilities.invokeLater(main::display);
}
private void display(){
System.setProperty("org.graphstream.ui", "swing");
Graph sourceGraph = prepareGraph();
Viewer viewer1 = new SwingViewer(sourceGraph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);
viewer1.enableAutoLayout(new SpringBox());
Viewer viewer2 = new SwingViewer(sourceGraph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);
viewer2.enableAutoLayout(new SpringBox());
ViewPanel viewPanel1 = new DefaultView(viewer1,"panel1",new SwingGraphRenderer());
viewPanel1.setPreferredSize(new Dimension(750,350));
ViewPanel viewPanel2 = new DefaultView(viewer2,"panel2",new SwingGraphRenderer());
viewPanel2.setPreferredSize(new Dimension(750,350));
JPanel panel1 = new JPanel();
panel1.setBackground(Color.gray);
panel1.setLayout(new BorderLayout());
panel1.setPreferredSize(new Dimension(750,350));
panel1.add(viewPanel1,BorderLayout.CENTER);
JPanel panel2 = new JPanel();
panel1.setBackground(Color.blue);
panel2.setLayout(new BorderLayout());
panel2.setPreferredSize(new Dimension(750,350));
panel2.add(viewPanel2, BorderLayout.CENTER);
JPanel graphPanel = new JPanel();
graphPanel.setPreferredSize(new Dimension(1600, 600));
graphPanel.setLayout(new BorderLayout(10,10));
graphPanel.add(panel1,BorderLayout.WEST);
graphPanel.add(panel2, BorderLayout.EAST);
JComboBox<String> lCCommunitiesNames = new JComboBox<>();
lCCommunitiesNames.setPreferredSize(new Dimension(795,30));
JPanel lCComboPanel = new JPanel();
lCComboPanel.setLayout(new BorderLayout());
lCComboPanel.add(lCCommunitiesNames,BorderLayout.CENTER);
JComboBox<String> minoltaCommunitiesNames = new JComboBox<>();
minoltaCommunitiesNames.setPreferredSize(new Dimension(795,30));
JPanel minoltaComboPanel = new JPanel();
minoltaComboPanel.setLayout(new BorderLayout());
minoltaComboPanel.add(minoltaCommunitiesNames, BorderLayout.CENTER);
JPanel selectorPanel = new JPanel();
selectorPanel.setLayout(new BorderLayout(10,10));
graphPanel.setPreferredSize(new Dimension(1600, 100));
selectorPanel.add(lCComboPanel,BorderLayout.WEST);
selectorPanel.add(minoltaCommunitiesNames, BorderLayout.EAST);
JFrame f=new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setSize(new Dimension(1600,900));
f.setLayout(new BorderLayout(200,10));
f.add(graphPanel,BorderLayout.WEST);
f.add(selectorPanel,BorderLayout.SOUTH);
f.setVisible(true);
}
private Graph prepareGraph(String path){
Graph graph = new DefaultGraph("sampleGraph");
graph.setAutoCreate(true);
graph.setStrict(false);
graph.addNode("A");
graph.addNode("B");
graph.addNode("C");
graph.addNode("D");
graph.addNode("E");
graph.addEdge("1","A","B");
graph.addEdge("2","A","C");
graph.addEdge("3","C","B");
graph.addEdge("4","C","D");
graph.addEdge("5","C","E");
return graph;
}
}
您必須添加圖表,但這是我想出的 GUI。
我創建了一個JFrame
和兩個主要的JPanels
。 每個主JPanel
內部都有一個視圖JPanel
和一個JComboBox
。 我為兩個視圖JPanels
提供了首選大小,因為它們沒有任何 Swing 組件來調整它們的大小。 我希望您創建的圖表將調整視圖JPanels
的大小。
我在整個 GUI 中使用了BorderLayouts
。 我以自己的方法創建了每個JPanel
,因此我可以測試不同的 Swing 布局管理器。 如果您想要更多空白,您可以調整兩個主要JPanel
方法中的空白邊框。
這是完整的可運行代碼。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class MultipleViews implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new MultipleViews());
}
@Override
public void run() {
JFrame frame = new JFrame("Multiple Views");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createPanel1(), BorderLayout.BEFORE_LINE_BEGINS);
frame.add(createPanel2(), BorderLayout.AFTER_LINE_ENDS);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createPanel1() {
JPanel panel = new JPanel(new BorderLayout(5, 5));
panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
panel.add(createView1(), BorderLayout.CENTER);
JComboBox<Transaction> lCCommunitiesNames = new JComboBox<>();
panel.add(lCCommunitiesNames, BorderLayout.AFTER_LAST_LINE);
return panel;
}
private JPanel createView1() {
JPanel panel = new JPanel(new BorderLayout());
panel.setBackground(Color.gray);
panel.setPreferredSize(new Dimension(750, 350));
return panel;
}
private JPanel createPanel2() {
JPanel panel = new JPanel(new BorderLayout(5, 5));
panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
panel.add(createView2(), BorderLayout.CENTER);
JComboBox<Transaction> minoltaCommunitiesNames = new JComboBox<>();
panel.add(minoltaCommunitiesNames, BorderLayout.AFTER_LAST_LINE);
return panel;
}
private JPanel createView2() {
JPanel panel = new JPanel(new BorderLayout());
panel.setBackground(Color.blue);
panel.setPreferredSize(new Dimension(750, 350));
return panel;
}
public class Transaction {
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.