Добавить график 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(), Измените размер окна, чтобы увидеть эффект.

образ

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://stackru.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);
    }
}
Другие вопросы по тегам