首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在java swing GUI中创建可移动的节点和边?

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

Stack Overflow用户
提问于 2012-07-28 00:40:32
回答 3查看 3.5K关注 0票数 2

在我的java项目中,我需要使用swing创建一个GUI,在其中我将拥有一个类似画布的空间。用户应该能够单击并创建节点,然后用边链接节点(就像在MS Visio中创建UML关系图一样)。用户还应该能够将节点与边一起移动。然后,我的应用程序将保存网络并运行自私节点算法,用户应该能够在GUI上实时看到它(边的创建和消除)。我不确定需要使用哪些swing工具来完成此任务。(可以在WPF中完成吗?我必须使用什么工具来完成)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-28 00:50:46

试试这个

代码语言:javascript
运行
复制
<dependency>
        <groupId>jgraph</groupId>
        <artifactId>jgraph</artifactId>
        <version>5.13.0.0</version>
    </dependency>

我们用这个库创建了一个非常复杂的swing UI界面,里面有很多面向图形的结构。看看这里,http://www.jgraph.com,还是直接在这里,http://www.jgraph.com/images/business-large.png,这是你要找的吗?

票数 6
EN

Stack Overflow用户

发布于 2012-07-28 00:49:08

如果你正在尝试“使用你自己的”解决方案,我有一些建议:

显然,您将需要使用MouseAdapter.

  • Your可以组合成单个实体的MouseMotionListener和MouseListener,可能会在的paintComponent方法中绘制线条。
  • ,那么你对节点的选择就不一样了。您可以使用诸如JLabels这样的组件,每个组件都附加了一个MouseAdapter (同样是MouseListener和MouseMotionListener)
  • ,或者您可以使用添加到JPanel的单个MouseAdapter,并在JPanel的paintComponent(...)方法中再次将节点呈现为矩形。
  • 节点和连接的数据应该与图形用户界面分开保存,也许可以放在它自己的“模型”类中,作为MVC (模型-视图-控制器)的一部分。MouseAdapter将成为MVC结构的“控件”的一部分,并将更改模型。
  • 我更希望能够向模型中添加侦听器(如PropertyChangeListener ),并让视图( Swing GUI )根据所触发的侦听器来更改其显示。

由于这可能是家庭作业,所以我将留给您来制定细节和代码,但如果您在特定步骤中遇到困难,请随时返回您的代码。

票数 4
EN

Stack Overflow用户

发布于 2012-07-28 00:55:38

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

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

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

代码语言:javascript
运行
复制
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));
}

图中的对象表示为:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11692095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档