2

私のJavaプロジェクトでは、スペースのようなキャンバスを持つスイング付きのGUIを作成する必要があります。ユーザーは、ノードをクリックして作成し、ノードをエッジにリンクできる必要があります(MS VisioでUML図を作成する場合と同様)。ユーザーは、エッジとともにノードを移動できる必要もあります。次に、私のアプリケーションはネットワークを保存し、利己的なノードアルゴリズムを実行し、ユーザーはそれをGUIでライブで確認できるはずです(エッジの作成と削除)。これを達成するためにどのスイングツールを使用する必要があるかわかりません。(そして、それはWPFで実行できますか、そのためにどのツールを使用する必要がありますか)

4

3 に答える 3

6

これを試してみてください

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

このlibを使用して、グラフ指向の構造が多数ある非常に複雑なスイングUI画面を実際に作成しました。こちらhttp://www.jgraph.comまたは直接こちらhttp://www.jgraph.com/images/business-large.pngをご覧ください。これはあなたが探しているものですか?

于 2012-07-27T16:50:45.890 に答える
4

あなたが「あなた自身の」解決策を転がそうとしているなら、私はいくつかの提案があります:

  • 明らかに、MouseAdapterを使用して単一のエンティティに組み合わせることができるMouseListenerとMouseMotionListenerを使用する必要があります。
  • 線は、JPanelのpaintComponentメソッドで描画される可能性があります。
  • 次に、ノードの選択が異なります。それぞれにMouseAdapterがアタッチされたJLabelsなどのコンポーネントを使用できます(これもMouseListenerとMouseMotionListenerの両方として)
  • または、JPanelに追加された単一のMouseAdapterを使用して、JPanelのpaintComponent(...)メソッドでノードを再び長方形としてレンダリングすることもできます。
  • ノードと接続のデータは、GUIとは別に、おそらくMVC(model-view-controller)アプリケーションの一部として独自の「モデル」クラスに保持する必要があります。
  • MouseAdapterは、MVC構造の「コントロール」の一部であり、モデルを変更します。
  • PropertyChangeListenerなどのリスナーをモデルに追加し、ビューであるSwing GUIに、起動されたリスナーに基づいて表示の変更を促すことができるようにすることを好みます。

これはおそらく宿題なので、詳細とコードの作成はあなたに任せますが、特定のステップで行き詰まった場合は、遠慮なくコードを返してください。

于 2012-07-27T16:49:07.580 に答える
4

JUNGライブラリを試してみることをお勧めします。JUNGは(機能が少なくても)初心者JGraphよりも習得しやすいと思ったので、(ではなく)このライブラリを使用してアプリケーションを作成しました。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));
}

また、グラフ内のオブジェクトは次のように表されます。 クラス階層

于 2012-07-27T16:55:37.660 に答える