2012-07-27 87 views
1

在我的java项目中,我需要创建一个带有swing的GUI,我将拥有一个像空间一样的画布。用户应该能够点击并创建节点,然后用边连接节点(就像你将在MS Visio中创建一个UML图)。用户还应该能够将节点与边缘一起移动。然后我的应用程序将保存网络并运行自私的节点算法,用户应该能够在GUI上看到它(创建和消除边缘)。我不确定我需要使用哪种摆动工具来完成此操作。 (并且可以将其在WPF做,我有什么工具来使用该)如何在java swing GUI中创建可移动的节点和边缘?

+2

这功课是?你到目前为止获得了哪些代码? – Reimeus 2012-07-27 16:42:59

+0

是的,这是我的学校项目,我还没有开始任何编码。 – Ramy 2012-07-27 17:55:09

回答

4

如果你想“推出自己的”解决方案,我有几个建议:

  • 显然,你需要使用MouseListener和MouseMotionListener,它们可以通过使用MouseAdapter组合成一个实体。
  • 您的线条可能会绘制在JPanel的paintComponent方法中。
  • 然后你对节点的选择就会发生变化。您可以使用组件(如JLabels),每个组件都附带一个MouseAdapter(同时作为MouseListener和MouseMotionListener),或者您可以使用单个MouseAdapter添加到JPanel,并再次在JPanel的paintComponent(...)方法中将节点呈现为矩形。
  • 节点和连接的数据应与GUI分开保存,可能在其自己的“模型”类中作为MVC(模型 - 视图 - 控制器)应用程序的一部分。
  • MouseAdapter将成为MVC结构的“控件”的一部分,并会改变模型。
  • 我更喜欢能够将监听器添加到我的模型中,例如PropertyChangeListener,并且让视图Swing GUI根据其侦听器被触发来激发其显示更改。

因为这可能是家庭作业,所以我会留给你解决细节和代码问题,但如果你被困在特定的步骤中,随时可以随身携带你的代码。

+1

针对MVC的+1。['GraphPanel'](https://sites.google.com/site/drjohnbmatthews/graphpanel)是一个演示一些基本技巧的例子。 – trashgod 2012-07-27 18:22:10

5

试试这个

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

我们真的创造了十分复杂摆动UI屏幕采用了大量的曲线结构导向与此库。看看这里http://www.jgraph.com或直接在这里http://www.jgraph.com/images/business-large.png这是你在找什么?

+0

一般问题:我可以使用html5和JS为我的桌面Java应用程序构建gui。如果是的话,我需要什么工具? – Ramy 2012-08-02 01:43:44

4

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

它看起来像这样(大概这或多或少是你想要做什么): Application example

这里是核心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)); 
} 

和对象图表由: Class hierarchy

+0

['JGraph'](http://www.jgraph.com/)是另一种选择。 – trashgod 2012-07-27 17:32:27

+0

是的,我考虑过使用'JGraph',但在那一刻JUNG似乎更容易学习。 – Xeon 2012-07-27 17:35:22

+0

好点;我的意思是赞同通过学习/使用一个图书馆的海报,而不是手工编码的繁琐手段。 +1顺便说一句。 – trashgod 2012-07-27 17:47:43