2012-07-27 82 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