• ベストアンサー

グラフ生成をGUIで。

説明しづらいのですが、 ============================ Javaによって生成された画面上の任意の点を右クリックして出るポップアップメニューの「生成」なる項目を選択するとダイアログボックスが現れ、例えば名前やIDなどを入力して決定を押すと、その右クリックした地点に●が表示されついでに内部的においても 点を意味する Point なるオブジェクトが生成される。 また任意の場所で右クリックして出るポップアップメニューの「連結」なる項目をクリックし、2つの●をチョンチョンとクリックするとそれらを結ぶ線が表示され、ついでに内部でも 2つのPointオブジェクト同士をリンクさせる. 最後に「保存」なるボタンを押すと、出来上がったグラフの情報(どの位置に点があって、どの点とどの点が結ばれているか等)をファイルに保存する. ========================= つまり単純に無向グラフをGUI操作で生成して、なんらかのファイル形式に保存したいと思っています. ただ、GUI部分をどう始めればよいか見当がつきません. awt の canvas を使って全て作るとなると、「クリックした場所の当たり判定」みたいなことをしなければいけないのかな?なんて思って気が引けてしまいます。 このようなことをしたい場合はどういった方法が考えられるでしょうか. アドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

/*キャンパス上でのマウス左クリック時の処理。 前もって、ポップアップメニュー処理時に、 「生成」項目が選択されたら変数stateにS_POINT_CREATEを、 「連結」項目が選択されたら変数stateにS_LINE_CREATE_1を 代入しておく*/ public void mouseClicked(MouseEvent e){  int x=e.getX(),y=e.getY();  switch(state){   case S_NORMAL://通常モード    break;   case S_POINT_CREATE://点生成モード    list.add(new MyPoint(x,y));//点をリストに登録    state=S_NORMAL;//通常モードに戻す    canvas.repaint();    break;   case S_LINE_CREATE_1://連結モード1(始点決定処理)    MyPoint p=hit(x,y);//クリック位置と図形リストとの当たり判定    if(null!=p){//「当たった」図形(点)があったら…     old_point=p;//その図形(点)を記憶しておく     state=S_LINE_CREATE_2;//いざ連結モード2へ!    }else{//どの図形(点)にも当たらなかったら…     state=S_NORMAL;//通常モードに戻す    }    break;   case S_LINE_CREATE_2://連結モード2(終点決定処理)    MyPoint p=hit(x,y);//クリック位置と図形リストとの当たり判定    if(null!=p &&//「当たった」図形(点)があり、かつ     p!=old_point){//それが「始点」でないなら…     list.add(new MyLine(old_point,p));//線をリストに登録     canvas.repaint();    }    old_point=null;//記憶を消去しておく    state=S_NORMAL;//通常モードに戻す    break;  } } --- 「全図形との当たり判定」は、 図形群が登録された「図形リスト」の全要素それぞれに対して "個別に"「当たり判定」を行うだけ。 ↓解説。 ソースコード付きなので、 これだけでとりあえずなんとかなるでしょう。 (C++だけど、Javaに似てるので「流れ」は読めます。コメントつき。 Boland C++Bulderのライブラリを使ってるのかな?) http://www.itmedia.co.jp/enterprise/0309/22/epn10.html (ソースコードはUPageForm.cppあたりに上記の分岐処理が書かれている)

ytse
質問者

お礼

お礼が遅れてしまって大変申し訳ありません.. パスワードを忘れてログインできずに居ましたm(_ _;)m 参考URLが大変参考になりました! ドローイングツールの基本的な仕組みはこうなっていたんですね. #1さんの方法と合わせて、無事作成することができました。 本当にありがとうございます。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

クリックに反応できるカスタムコンポーネントを作るといいのかも 連結の処理なんかは、 例えば、クラス変数で、連結モードになっていたら…というような処理でいいかと思います。

ytse
質問者

お礼

お礼が遅れてしまって大変申し訳ありません! 誤ってパスワードマネージャの記録を消してしまい、ログインできませんでしたm(_ _;)m >クラス変数で、連結モードになっていたら…というような処理でいいかと思います。 描画やクリックイベントなどの基本的な仕組みは#2さんの方法を用いて、2点間の連結操作には#1さんの方法をそのまま使わせていただきました。 大変参考になりました。 ありがとうございます。

関連するQ&A