繁体   English   中英

如何在java swing GUI中创建可移动节点和边缘?

[英]how to create movable nodes and edges in java swing GUI?

在我的java项目中,我需要创建一个带有swing的GUI,我将拥有一个类似于space的画布。 用户应该能够单击并创建节点,然后使用边链接节点(就像在MS Visio中创建UML图一样)。 用户还应该能够将边缘移动节点。 然后我的应用程序将保存网络并运行自私节点算法,用户应该能够在GUI上看到它(创建和消除边缘)。 我不确定我需要使用哪种摆动工具来实现这一目标。 (可以在WPF中完成,我必须使用哪些工具)

试试这个

<dependency>
        <groupId>jgraph</groupId>
        <artifactId>jgraph</artifactId>
        <version>5.13.0.0</version>
    </dependency>

我们真的用这个lib创建了非常复杂的swing UI屏幕,其中有很多面向图形的结构。 看看这里http://www.jgraph.com或直接在这里http://www.jgraph.com/images/business-large.png这是你要找的东西?

如果您正在尝试“推出自己的”解决方案,我会提出一些建议:

  • 显然,您需要使用MouseListener和MouseMotionListener,它们可以通过使用MouseAdapter组合成单个实体。
  • 您的行可能会在JPanel的paintComponent方法中绘制。
  • 那么你对节点的选择就会发生分歧。 您可以使用JLabel等组件,每个组件都附带一个MouseAdapter(同样作为MouseListener和MouseMotionListener)
  • 或者您可以使用添加到JPanel的单个MouseAdapter,并在JPanel的paintComponent(...)方法中再次将节点渲染为矩形。
  • 节点和连接的数据应与GUI分开,可能在其自己的“模型”类中作为MVC(模型 - 视图 - 控制器)应用程序的一部分。
  • MouseAdapter将成为MVC结构“控制”的一部分,并会改变模型。
  • 我更喜欢能够将侦听器添加到我的模型中,例如PropertyChangeListener,并且具有视图,即Swing GUI,根据其触发器的触发,启动其显示的更改。

由于这可能是家庭作业,我将让您详细说明细节和代码,但如果您遇到特定步骤,请随时回复您的代码。

我建议你试试JUNG图书馆。 我用这个库(而不是JGraph )创建了一个应用程序,因为我认为JUNG比新手更容易学习JGraph (即使它提供的功能较少)。 我只需要简单的节点和它们之间的边。

它看起来像这样(可能这或多或少是你想要做的): 应用实例

以下是核心JUNG功能的基本代码片段:

public ArchitectureEditor(String title, MainWindow mainWindow, ArchObjContextConcern contextConcern) {
    super(title);
    setName(NAME);

    graph = new DirectedSparseGraph<ArchObject, EdgeKey>();

    layout = new StaticLayout<ArchObject, EdgeKey>(graph);
    vv = new AutoCropVisualizationViewer(layout); //extends VisualizationViewer<ArchObject, EdgeKey>
    vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<ArchObject, EdgeKey>());

    VERTEX_ICON_TRANSFORMER = new ArchObjIconTransformer(vv);
    VERTEX_SHAPE_TRANSFORMER = new ArchObjShapeTransformer(vv);
    vv.getRenderContext().setVertexShapeTransformer(VERTEX_SHAPE_TRANSFORMER);
    vv.getRenderContext().setVertexIconTransformer(VERTEX_ICON_TRANSFORMER);

    graphMouse = new ArchGraphMouse(mainWindow, contextConcern);
    vv.setGraphMouse(graphMouse);
    vv.addKeyListener(new ArchGraphKeyboard(mainWindow, this));
    vv.setBackground(Color.WHITE);

    ComponentUtils.setForcedSize(vv, 1, 1);
    setLayout(new BorderLayout());
    add(new JScrollPane(vv));
}

图中的对象表示为: 类层次结构

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM