【问题标题】:Multiple views on same graph with different styles同一图表上具有不同样式的多个视图
【发布时间】:2021-07-02 07:37:54
【问题描述】:

我正在尝试比较社区检测算法的输出,并且我想进行并排比较。这个想法是,我将有两个窗口显示相同的图形布局,并根据所选输出为节点和边缘着色。一个简单的例子是这样的:

我能够生成图形并创建视图,但我没有找到如何在 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;
}
}

【问题讨论】:

    标签: java swing graphstream


    【解决方案1】:

    您必须添加图表,但这是我想出的 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 {
            
        }
    
    }
    

    【讨论】:

    • 感谢您的回复,我将编辑问题。问题不在于swing布局,而在于graphstream中的图形布局。我在同一个图表上得到不同的视图,我需要相同的视图。此外,我需要在两个图表上编辑颜色,因此仅复制视图不是解决方案。
    猜你喜欢
    • 2019-07-14
    • 2020-10-29
    • 1970-01-01
    • 2021-07-25
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多