JGraphX ​​разрушает границы Swing-компонентов

Я пытаюсь реализовать взаимодействие между некоторыми самописными элементами графического интерфейса (например, кнопками Java-swing) и JGraphX. Для этого я сначала просто хочу отобразить кнопку рядом с элементом JGraph-Element - и я застрял.

Мой код для отображения самой кнопки работает нормально:

import javax.swing.*;    

public class HelloWorld extends JFrame {

public HelloWorld()
    {
         super("Everything works");
    }    

public static void main(String[] args)
    {
        hello_world frame = new hello_world();
        frame.setTitle("bub");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 200);

        button.setBounds(10, 10, 100, 50);

        frame.setVisible(true);

        frame.add(button);
    }
}

JGraphX ​​разрушает границы Swing-компонентов

Но как только я добавляю JGraph-Component, кнопка отображается в полноэкранном режиме. Я понятия не имею, почему и как это предотвратить. Мой код:

import javax.swing.*;

import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;

public class HelloWorld extends JFrame {

    private mxGraph graph;
    private Object window;

    public HelloWorld()
    {
        super("Nothing works");

        graph = new mxGraph();
        window = graph.getDefaultParent();

        graph.getModel().beginUpdate();

        try
        {
            Object v2 = graph.insertVertex(window, null, "Hello World!", 200, 150, 80, 30);

        }
        finally
        {
            graph.getModel().endUpdate();
        }

        mxGraphComponent graphComponent = new mxGraphComponent(graph);
        getContentPane().add(graphComponent);
    }

    public static void main(String[] args)
    {
        hello_world frame = new hello_world();


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 200);

        JButton button = new JButton("left");
        button.setBounds(10, 10, 100, 50);

        frame.setVisible(true);

        frame.add(button);
    }

}

Результат выглядит следующим образом (я вручную изменил размер окна, чтобы показать вам кнопку. Естественно, кнопка просто заполнила бы пространство позади JGraph-Component и поэтому была бы невидимой):

JGraphX ​​разрушает границы Swing-компонентов

Каждое произведение в имени класса должно начинаться с символа верхнего регистра. "hello_world" должен быть HelloWorld. В случае сомнений следуйте формату имен классов, найденному в Java API.

camickr 14.11.2018 17:24

Вы правы, но я почти уверен, что это не главная проблема;)

Jere 14.11.2018 17:27
I'm pretty sure thats not the main problem there Поэтому я и добавил это в качестве комментария. На форуме будут выделены имена классов. Это облегчает нам (или кому-либо еще) чтение вашего кода, если вы следуете стандартам. Нет причин не следовать стандартам. Всем выгодно.
camickr 14.11.2018 18:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Swing использует менеджеры по расположению. Менеджером компоновки по умолчанию для JFrame является BorderLayout. Когда вы добавляете компонент в рамку, по умолчанию используется ограничение BorderLayout.CENTER. К CENTER из BorderLayout можно добавить только один компонент.

SetBounds (...) будет работать только временно. Как только размер кадра изменяется, вызывается менеджер компоновки, и кнопке будет присвоен новый размер / местоположение в соответствии с правилами менеджера компоновки.

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

Начните с чего-нибудь простого, например:

frame.add(button, BorderLayout.PAGE_END);
frame.setVisible(true);
//frame.add(button);

Приведенный выше график отобразит ваш график в центре рамки и кнопку внизу.

Другие вопросы по теме