Добавить граф GraphStream в пользовательский jPanel

Я работаю над библиотекой GraphStream. На данный момент, когда я запускаю свою программу, он открывает новое окно для моего графика и отдельное окно для моего графика. Я попытался создать JFrame и добавить JPanel в JFrame, после этого я попытался добавить график в свой JPanel, но он говорит, что объект графа не является компонентом.

Вот мой код:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import org.graphstream.graph.*;
import org.graphstream.graph.implementations.*;

public class GraphExplore {
    static Connection conn2;
    static String result, result2;
    static JFrame frame;
    static JPanel panel;

    public static void main(String args[]) throws SQLException {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    showData();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private static void showData() throws SQLException {

        JFrame frame = new JFrame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(30, 50, 1300, 600);
        panel = new JPanel();
        panel.setBorder(new EmptyBorder(5, 5, 5, 5));
        panel.setLayout(new BorderLayout(0, 0));
        frame.setContentPane(panel);

        Graph graph = new SingleGraph("tutorial 1");
        graph.setAutoCreate(true);
        graph.setStrict(false);
        graph.display();

        // panel.add(graph);

        try {
            Class.forName("org.h2.Driver");
            conn2 = DriverManager.getConnection("jdbc:h2:file:G:/hs_data/h2_db/test", "sa", "sa");

        } catch (Exception e) {
            e.printStackTrace();
        }
        Statement stmt2 = conn2.createStatement();
        ResultSet rs2 = stmt2.executeQuery("SELECT ANUMBER,BNUMBER,DATETIME FROM TEST");
        while (rs2.next()) {
            result = rs2.getString("ANUMBER");
            result2 = rs2.getString("BNUMBER");
            graph.addNode(result);
            graph.addNode(result2);
            int i;
            for (i = 0; i < 200; i++)
                graph.addEdge("string" + i, result, result2);
            // JOptionPane.showMessageDialog(null, i);
        }

        for (Node node : graph) {
            node.addAttribute("ui.label", node.getId());
        }

    }

}

Эта программа открывает отдельные окна для JFrame и графика. Я хочу показать свой график в JFrame или JPanel. Любая идея о том, как это сделать? Я видел эту ссылку , но она меня не очень хорошо объясняет.

Ответ 1

Как показано в Графическая визуализация: расширенный просмотр: интеграция зрителя в графический интерфейс, вам нужно будет создать программу просмотра самостоятельно. " Кроме того, вызовите setVisible() после того, как вы построили фрейм.

Показывает ошибку на frame.add(view).

Похоже, что упомянутое урок немного устарело. Метод Viewer addDefaultView() теперь возвращает ViewPanel, который можно добавить в Container. В приведенном ниже примере граница устанавливается на окружении JPanel, имеющем GridLayout, и что panel добавляется к кадру. Также обратите внимание на необходимость указать panel предпочтительный размер, переопределив getPreferredSize(). Измените размер окна, чтобы увидеть эффект.

image

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import org.graphstream.graph.*;
import org.graphstream.graph.implementations.*;
import org.graphstream.ui.swingViewer.*;
import org.graphstream.ui.view.*;

/** @see https://stackoverflow.com/a/45055683/230513 */
public class GraphSwing {

    public static void main(String args[]) {
        EventQueue.invokeLater(new GraphSwing()::display);
    }

    private void display() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new GridLayout()){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 480);
            }
        };
        panel.setBorder(BorderFactory.createLineBorder(Color.blue, 5));
        Graph graph = new SingleGraph("Tutorial", false, true);
        graph.addEdge("AB", "A", "B");
        Node a = graph.getNode("A");
        a.setAttribute("xy", 1, 1);
        Node b = graph.getNode("B");
        b.setAttribute("xy", -1, -1);
        Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);
        ViewPanel viewPanel = viewer.addDefaultView(false);
        panel.add(viewPanel);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}