Добавить граф 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);
}
}