Nano Hash - криптовалюты, майнинг, программирование

Как рисовать узлы и ребра в пользовательском компоненте качания Java, который расширяет JPanel с помощью GraphStream (или другой библиотеки)?

Я создаю пользовательский интерфейс для Java-программы Swing, которая должна позволять пользователю создавать сеть узлов, соединенных ребрами. Пользователю разрешено маркировать эти узлы и ребра.

Пользовательский интерфейс в настоящее время имеет настраиваемый графический компонент, который расширяет JPanel и имеет смысл сам по себе, имея рабочие операции, такие как масштабирование и перетаскивание. Я пытаюсь использовать библиотеку GraphStream (http://graphstream-project.org/), чтобы пользовательскую панель в View, которая поддерживает GraphStream Graphs. Поскольку GraphStream поставляется с классом DefaultView, способным отображать базовые графики «из коробки», и расширяет JPanel, я решил модифицировать свой компонент карты, чтобы он расширял DefaultView. Итак, мое определение класса для фонового компонента теперь

public class CustomPanel extends DefaultView implements ICustomListener
{
    public CustomPanel(Viewer viewer, String identifier, GraphRenderer renderer)
    {
        super(viewer, identifier, renderer);
        ...
    }
}

Однако компонент не может отображать какие-либо графики или возможности рисования. Вот как я приступил к формированию тестового графика

Graph graph = new GraphicGraph("embedded");
Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);

Node a = graph.addNode("A");
a.addAttribute("xy", 0, 0);
Node b = graph.addNode("B");
b.addAttribute("xy", 10, 0);
Node c = graph.addNode("C");
c.addAttribute("xy", 10, 10);
graph.addEdge("AB","A","B");

//This is where I assume the GraphStream magic should happen.
CustomPanel myPanel = new CustomPanel(viewer, "defaultView", Viewer.newGraphRenderer());
viewer.addView(myPanel);
myPanel.display((GraphicGraph)(graph), true);

Я могу отобразить тот же график с

viewer.addDefaultView(true);

но открывается в новом окне.

Так что же я делаю не так, или возможно ли вообще отображать графики с помощью GraphStream на пользовательских компонентах? Если есть другая библиотека, которая может это сделать, я был бы благодарен узнать. Я знаю о JUNG2 и Java2D, но еще не пробовал их. Я также мог бы жить с решением, которое открывает редактор в другом окне, но мне по-прежнему нужна моя CustomPanel в качестве фона.


  • См. также Визуализация. 13.07.2015
  • Спасибо за ссылку, но я прочитал ее, прежде чем задавать вопрос. Раздел «Дополнительно», кажется, дает некоторые подсказки, но все еще остается неясным, что делать. Кроме того, такие предложения, как Чтобы интегрировать средство просмотра в графический интерфейс Swing, вам нужно будет создать средство просмотра самостоятельно и Даже если вы не создали представление самостоятельно, вы всегда можете получить доступ к представлению по умолчанию, созданному для вас, конфликтуют друг с другом, тем более, что библиотека использует и нуждается как в представлении, так и в средстве просмотра для работы. 13.07.2015

Ответы:


1

Если кто-то сталкивается с той же проблемой, вот что я сделал, чтобы ее преодолеть. Имейте в виду, что крайне важно, чтобы фоновый компонент сохранял все свои исходные возможности. В целом, реализация GraphStream DefaultView была хорошим примером.

Я сделал класс, который расширился от фона и реализовал org.graphstream.ui.view.View

public class HybridView extends CustomView implements View

Затем я обнаружил, что мне нужно изменить средства визуализации GraphStream по умолчанию, где было важно написать свой собственный метод renderGraph. Я просто скопировал реализацию из суперкласса и закомментировал некоторые строки:

protected void renderGraph(Graphics2D g) {
    StyleGroup style = graph.getStyle();

    setupGraphics(g);
    //Dont paint on the background
    //renderGraphBackground(g);
    //Commenting out the next line had no visible effects so I left it unmodified, tho it's name begs for being commented out
    renderBackLayer(g);
    camera.pushView(graph, g);
    renderGraphElements(g);

    if (style.getStrokeMode() != StyleConstants.StrokeMode.NONE
            && style.getStrokeWidth().value != 0) {
        GraphMetrics metrics = camera.getMetrics();
        Rectangle2D rect = new Rectangle2D.Double();
        double px1 = metrics.px1;
        Value stroke = style.getShadowWidth();

        rect.setFrame(metrics.lo.x, metrics.lo.y + px1,
                metrics.size.data[0] - px1, metrics.size.data[1] - px1);
        g.setStroke(new BasicStroke((float) metrics.lengthToGu(stroke)));
        g.setColor(graph.getStyle().getStrokeColor(0));
        g.draw(rect);
    }

    camera.popView(g);
    renderForeLayer(g);
}

public class MyGraphRenderer extends GraphRendererBase 

Затем, чтобы использовать компонент с возможностями рисования GraphStream и мой ранее существующий осмысленный фоновый компонент:

Graph graph = new GraphicGraph("embedded");
Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);
CustomPanel myPanel = new CustomPanel(viewer, "defaultView", new MyGraphRenderer());
20.07.2015

2

Не уверен, что понимаю, что вы хотите сделать. Но если вы просто хотите добавить представление GraphStream в свой собственный графический интерфейс, вам не нужно расширять файл DefaultView. Созданное вами средство просмотра в порядке, поэтому вам нужно только вставить новое представление в свой графический интерфейс следующим образом:

    // create a view *without* a JFrame
    View view = viewer.addDefaultView(false);
    view.setPreferredSize(new Dimension(600, 400));

    JFrame f = new JFrame("Your GUI");
    // add the view to your components (JFrame, JPanel...)
    f.add(view, BorderLayout.CENTER);
    // add your other GUI stuff here...
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.pack();
    f.setVisible(true);
13.07.2015
  • Спасибо за Ваш ответ. Дело в том, что я хочу, чтобы ранее существовавший элемент графического интерфейса (который расширяет JPanel) действовал как представление моего графика. Поэтому я расширил этот пользовательский компонент из DefaultView, пытаясь добиться этого. Простой выбор представления из средства просмотра не приводит к этому, так как тогда представление и мой пользовательский компонент не будут объединены, если это имеет смысл? 13.07.2015
  • Теперь я понимаю. Тогда ваш пример работает. Вам нужно только убедиться, что объект myPanel привязан к существующему графическому интерфейсу someGUIFrame.add(myPanel, BorderLayout.CENTER); 14.07.2015
  • Хорошо, я вижу график, но плохо то, что он полностью скрывает под ним мой компонент стоимости (myPanel). Знаете ли вы о способе простого рисования узлов и ребер поверх моего компонента, а также возможности видеть фоновый компонент? Придется ли мне редактировать рендерер? 14.07.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..