簡體   English   中英

具有不同 styles 的同一圖上的多個視圖

[英]Multiple views on same graph with different styles

我正在嘗試比較社區檢測算法的輸出,並且我想進行並排比較。 這個想法是,我將有兩個 windows 顯示相同的圖形布局,並且我根據所選的 output 為節點和邊緣着色。 一個簡單的例子是這樣的: GUI 示例視圖

我能夠生成圖形並創建視圖,但我沒有發現如何在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM