• ベストアンサー

グラフ生成をGUIで。

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

  • ytse
  • お礼率71% (88/123)
  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • 動的生成、Dynamic HTMLについて

    先日講義で「Webアプリケーションは動的生成、つまりDynamic HTMLを使用しているという点でGUIアプリケーションと異なる」という説明を受けました。 その後自分なりに動的生成、Dynamic HTMLというキーワードで検索してみましたが、動的生成という意味がいまいち腑に落ちません。 例えばWebアプリケーションで、ユーザー側でこのメニューは出して、このメニューは出さないといった設定を変更すると、掃き出されるHTMLは変化しますが、このことを動的生成というのでしょうか? しかしGUIアプリケーションでもユーザー側でそういった設定をして、GUIアプリケーションの表示を変えることは可能なような気がしますが・・・。 現在の個人的な見解としては Webアプリケーションの場合はプログラムからHTMLが生成され、そのHTMLはユーザーとの対話でいろいろな形で変化します(動的生成)。そしてその変化したHTMLが画面として反映されます。 しかしGUIアプリケーションはHTMLを掃き出す訳ではなく、プログラム自体も変化するわけではない。 こんな感じでしょうか? まとまりのない文章になってしまい申し訳ありませんが、どなたかご教授いただければと思います。もし間違っている箇所等ありましたらそちらも指摘していただければ幸いです。

    • 締切済み
    • PHP
  • FedoraCore4のGUI画面でのメニューバーの復元方法について

    FedoraCore4のGUI画面で、メニューバーを誤って削除してしまいまいした。マウスの右クリックのショートカットメニューには復元に関するようなものがありません。何か方法をご教示願います。

  • GUIで外付けドライブのマウントを解除する方法は?

    Windows10 1903 Homeで、GUIにて外付けドライブを安全に取り外す方法ってありますか? いつもクローンバックアップ用の外付けドライブ(SSD)を付けた時に思うのですが、無いでしょう? ドライブ上で右クリックしても、アンマウントの項目がありません。 プロパティを開いても、できそうな所は見つかりません。 タスクバー上から出来ないかと思いましたが、ドライブにあたるものがありません。 いつもシャットダウンやスリープして、ドライブのランプが消えたのを確認してから外していますが、メモリーカードとかUSBメモリーみたいに外せればいいと思います。 一度付けると気軽に取り外せなくなるのが不便。 コマンドプロンプトでなら、取り外す方法はあるんでしょう? マウントを解除するコマンドを入れれば。 素人にも簡単に取り外せるようにしておいてください。Microsoftさん。 あと、ついでに言っておくと、右クリックして出てくるメニュー、 名前の変更 と 削除 隣接させるのおかしいでしょ? 誤って削除しそうで怖いです。 なんでこの様な配置にするかなぁ Microsoftさん、改善してください。 よろしくお願いいたします。

  • Excelでグラフの画像ファイルの変更と生成

    当方は初心者につき、オフィスユーザとして当然知っているべき基本的なことであったとしても 自分なりに調べたうえでの質問ですので、何とぞご容赦願います。長文を失礼いたします。 Excel(2007)で、 「グラフを画像として出力」という機能が無いため、 画像ファイルを得るために1つ1つペイントソフトにペーストして保存しようと思いましたが、 同一ブック内における、株式チャートのような日々変動する様々なグラフを、頻繁に、かつ大量に画像保存しなければならず、いちいちペイントソフトを使ってられません。 そこで、ブック全体の新たなグラフ画像データをペイントソフトなしで、しかも一括で得るため、次のような方法を選びました。 「名前をつけて保存」→ファイルの種類を「Webページ(htmlファイル)」に選択→範囲を「ブック全体」→「発行」ボタンをクリック すると、ブック全体がhtmlファイルとして保存されるとともに、そのhtml内にある、すべての画像データもgif形式、ping形式で1つ1つ自動で保存されて、大変便利だと思っていたのですが、 1点問題がございました。 同一ブック内における、これらのファイルを順に一枚一枚、ブログにアップしようとしたところ、一度目は一見問題ありませんでした。 しかし、二度目にブック内の「一度目と同一のグラフ」の数値を更新し、上記の方法で新たに生成したping形式、gif形式の画像をいくらブログにアップロードしても、ブログ上で表示される画像は一度目のグラフ画像のままなのです。パソコン上にあるgif形式、ping形式の画像は最新の更新が適用されているにも関わらず。  これは、WEBデータとして保存する際、「名前を変更して保存」しても、「以前のファイルに追加」しても、あるいは「以前のファイルに上書き」して保存しても同様です。 しかし、その画像をブラウザ上で一度更新したところ、二度目の画像に更新されたのですが、お次は、1度目にアップロードして掲載した過去のブログ上の画像までが、二度目の画像として更新されてしまっており、1度目の古い画像と、2度目の最新の画像を画像データとしてブログ上に両立させることができません。 同一のブック内の、同一のグラフを更新してWEB保存したgifとpingなのだから、当たり前といえば当たり前です。もし過去のグラフのgifを残したければ、同一ブック内で新たにグラフを作ればよいだけです。そのうえでWEB保存すればよいだけです。しかし、これも手間なのです。 というのも、たとえば3月1日から3月7日までの折れ線グラフがあるとして、 このグラフに3月8日のデータを付加するのに、いちいちグラフを新たに作るよりも、 すでにある3月7日までのグラフをクリック→セルでグラフの有効範囲が黒い枠で指定されるので、その枠部分をドラッグして3月8日の行まで引き延ばせば自動で8日までのグラフに変更されるので、そのほうが効率がよいと思いまして。しかしそれはあくまでもグラフの「変更」であって、「生成」ではないわけで、要するに「変更」された同一のグラフを、別の画像ファイルとして「生成」したいのですが、効率のよいうまい方法はないでしょうか? やはり効率を良くするには、マクロとやらを学ぶべきでしょうか? まとまりのない長文で、大変申し訳ありませんが、主旨はうまく伝わりましたでしょうか?

  • 右クリックメニューの中の項目を消すには?

    右クリックすると右クリックメニューが出ますよね。いわゆるそこのポインタ位置でできる事が親切に表示されるわけなのですけども。 しかし、そのメニュー項目の中で、いらない項目があった場合どうやって消すのかが解りません。 色んなソフトを入れると勝手に生成されてしまったりしますよね。使わない項目は消したいんです。 よろしくお願いいたします。

  • 縦棒と折れ線の混じったグラフ

    excelやpower pointでグラフを作成したい。 系列が3系列以上あり、軸は一つで2系列は折れ線グラフ、残りの系列は縦棒グラフにしたい。お分かりの方教えて下さい。 私がやった範囲では、グラフ上である系列を左クリックで選択し、右クリックで「グラフの種類」→「ユーザー設定」→「折れ線-縦棒」を選択しましたが1系列しか折れ線グラフになりません。(系列選択がひとつしかできていないので当然かもしれませんが、系列を2つ同時に選択できれば可能ではないかと思っています。)

  • Excelで作ったグラフをホームページにすると・・・

    こんにちは Excelで作ったグラフをホームページに載せようとしています。 『webページで保存する』というメニューを選んで保存するとグラフのhtmlファイルができます。 これを1024X768以上の解像度で見ると、 グラフが左よりの位置になって、その右4分の1ぐらいと グラフの上下に余白ができそこが真っ白になります。 グラフを上下左右中央に持ってくる方法と 余白に色をつける方法はないでしょうか?

  • ポップアップメニュー

    ポップアップメニューについて質問させて頂きます。 リストビュー上で右クリックしたときにポップアップメニューを表示させているのですが、このポップアップメニューの項目がクリックされた時のイベントの取り方が分かりません。 ご存知の方、宜しくお願いします。 環境はVisual Studio6.0 Windows2000です

  • actionscript3.0 オブジェクトの動的生成

    actionscript3.0についての質問です。 イラストレーターのテキストツールのように 任意の文字オブジェクトを複数生成し、生成された任意の文字オブジェクト をドラッグで移動する処理をactionScriptで実行したいと考えています。 現在actionscript3.0で行いたいと考えている一連の流れは以下の通りです。 1.ステージに配置したテキストフィールに任意の文字列を入力 2.入力された文字列を参照してムービークリップ内のダイナミックテキストに出力。 3.ステージにボタンを配置し、それを押すことでステージに1.2の手順によって作成されたムービークリップが生成。 4.生成されたムービークリップをドラッグすると動かすことができる。 1から3までの内容を下記のようなスクリプトで行いました。 //ダイナミックテキストを内包するためのムービークリップを定義 //埋め込みアセットクラスmcからインスタンスを生成 var word_mc:MovieClip = new mc( ); //ボタンクリックイベントを登録 create_btn.addEventListener( MouseEvent.Click, creClick ); //ボタンクリック時の処理 function creClick( evt:MouseEvent ):void { //テキストフィールドinputWordに入力されたテキストを変数inputに格納 var input:String = inputWord.text; //word_mc内に配置したダイナミックテキストoutputWordに入力テキスト内容を出力 word_mc.outputword.text = input; //word_mcを画面に表示 addChild( word_mc ); } //word_mcをドラッグで移動させるためのスクリプト word_mc.addEventListener( MouseEvent.MOUSE_OVER, wordMO ); function wordMO( evt:MouseEvent ):void { word_mc.addEventListener( MouseEvent.MOUSE_DOWN, wordMD ); word_mc.addEventListener( MouseEvent.MOUSE_UP, wordMU ); } function wordMD( evt:MouseEvent ):void { word_mc.startDrag( ); } function wordMU( evt:MouseEvent ):void { word_mc.stopDrag( ); } ひとつのオブジェクトを生成するだけならこれで問題ないのですが、 このスクリプトでは、、"車"、"自転車"、"飛行機"という文字列をそれぞれ内包した変数名もしくはクラス名の違うオブジェクトを生成することが できません。 埋め込みアセットクラスをあらかじめ複数作っておいて、クラス名を 連番で名づけ、クラス名から動的にオブジェクトを生成すれば 内容の異なるオブジェクトを生成することは可能ですが、 単語を追加するたびに埋め込みアセットクラスを作成しなければ ならない上、変数名は同じなため、個々のオブジェクトをマウスドラッグすることができません。 イラストレーターのテキストツールのように 任意の文字列を生成した後、個々にマウスドラッグできようにするには どうしたら良いのでしょうか。 どうかご指導のほど、よろしくお願い致します。

    • ベストアンサー
    • Flash
  • Auto CADでショットカットの内容を変更

    初心者です。お手柔らかにおねがいします(^_^; Auto CADのメイン画面で右クリックしたときに出る、ポップアップメニュー(ショートカットメニューというのですか??デフォルトではコピーとか切り取りとかが入っているメニュー)の内容を変更したいのですが、設定しているファイル名を教えてください。ついでにCtrl+右クリックやShift+右クリックを設定しているファイルもおしえてください。

専門家に質問してみよう