JGraphX ​​разрушает границы Swing-компонентов - PullRequest
0 голосов
/ 14 ноября 2018

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

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

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);
    }
}

This is the Button as it is supposed to be shown

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

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 ипоэтому будет невидимым):

This is the Button, filling up the whole screen.

1 Ответ

0 голосов
/ 14 ноября 2018

Swing использует менеджеры по расположению. Диспетчером макета по умолчанию для JFrame является BorderLayout. При добавлении компонента во фрейм используется ограничение по умолчанию BorderLayout.CENTER. Только * один компонент может быть добавлен к CENTER из BorderLayout.

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

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

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

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

Выше будет отображаться ваш график в центре кадра и кнопка внизу.

...