JGraphX破坏了Swing组件的界限

时间:2018-11-14 16:09:36

标签: java swing jbutton jgraphx jgraph

我正在尝试实现一些自行编写的GUI元素(如Java摆动按钮)和JGraphX之间的交互。为了做到这一点,我首先只想在JGraph-Element旁边显示一个Button,然后就卡住了。

我显示按钮本身的代码工作正常:

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-Component,Button ist就会全屏显示。我不知道为什么以及如何防止这种情况。我的代码:

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 :(得分:1)

Swing使用布局管理器。 JFrame的默认布局管理器是BorderLayout。将组件添加到框架时,使用的默认约束为BorderLayout.CENTER。只能将单个组件添加到CENTER的{​​{1}}中。

setBounds(...)将仅临时起作用。调整框架大小后,将立即调用布局管理器,并根据布局管理器的规则为按钮指定新的大小/位置。

解决方案是正确使用布局管理器。我不确定您要实现哪种布局,因此我只能建议您阅读Layout Managers上的Swing教程,以获取入门的工作示例。然后,您可以将面板与不同的布局管理器嵌套在一起,以实现所需的效果。

从简单的东西开始:

BorderLayout

以上内容将图形显示在框架的中央,按钮显示在底部。