こんばんは。
今、酔歩を計算して結果をグラフに書くプログラムを作成しています。
酔歩自体はとても簡単なので簡単に出来たのですが、グラフがいまいちなんです。
とりあえず、drawLine と fillOval を使ってそれらしくはしているのですが、もっと良い方法があるはずだと思うんです。参考書もいくつか調べてみたのですが、動画やGUIのことばっかりで書いてありませんでした。
ご存知の方居ましたら教えてください。よろしくお願いします。

A 回答 (1件)

「いまいち」「それらしく」なグラフを「もっと良」くしたいとのことですが、それでは質問があまりにも曖昧で誰にも答えられません。



具体的に現状の仕様はどうで、それを具体的にどうしたいのでしょうか。

たとえば、現状の見栄えがシンプルすぎるので装飾を付けたいとします。Excelが描くグラフのように影を付けたいとしたら、Color.darker()でグラフ描画色よりも暗い色を取得して、座標をずらして描画すれば影になります。

この回答への補足

返事遅くなりまして申し訳ありません。
確かにそうでした。すいません。
グラフを作る専用のクラスはありますかという意味で聞いたんですがだめでしたね。

私は今、棒グラフを作りたいと考えています。
たとえばさいころを10回振って1の回数は何回、2は何回というようにしたいです。
drawLineなどで一応作成してみたのですが、変数がその分必要になってその数だけ条件判定してとかなり効率が悪いプログラムしか出来ませんでした。

では、もしお分かりであればぜひお願いします。

補足日時:2001/08/16 00:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qグラフ生成をGUIで。

説明しづらいのですが、

============================
Javaによって生成された画面上の任意の点を右クリックして出るポップアップメニューの「生成」なる項目を選択するとダイアログボックスが現れ、例えば名前やIDなどを入力して決定を押すと、その右クリックした地点に●が表示されついでに内部的においても 点を意味する Point なるオブジェクトが生成される。

また任意の場所で右クリックして出るポップアップメニューの「連結」なる項目をクリックし、2つの●をチョンチョンとクリックするとそれらを結ぶ線が表示され、ついでに内部でも 2つのPointオブジェクト同士をリンクさせる.

最後に「保存」なるボタンを押すと、出来上がったグラフの情報(どの位置に点があって、どの点とどの点が結ばれているか等)をファイルに保存する.
=========================

つまり単純に無向グラフをGUI操作で生成して、なんらかのファイル形式に保存したいと思っています.
ただ、GUI部分をどう始めればよいか見当がつきません.

awt の canvas を使って全て作るとなると、「クリックした場所の当たり判定」みたいなことをしなければいけないのかな?なんて思って気が引けてしまいます。

このようなことをしたい場合はどういった方法が考えられるでしょうか.
アドバイスをお願いします。

説明しづらいのですが、

============================
Javaによって生成された画面上の任意の点を右クリックして出るポップアップメニューの「生成」なる項目を選択するとダイアログボックスが現れ、例えば名前やIDなどを入力して決定を押すと、その右クリックした地点に●が表示されついでに内部的においても 点を意味する Point なるオブジェクトが生成される。

また任意の場所で右クリックして出るポップアップメニューの「連結」なる項目をクリックし、2つの●をチョンチョンとクリックするとそれらを...続きを読む

Aベストアンサー

/*キャンパス上でのマウス左クリック時の処理。
前もって、ポップアップメニュー処理時に、
「生成」項目が選択されたら変数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あたりに上記の分岐処理が書かれている)

/*キャンパス上でのマウス左クリック時の処理。
前もって、ポップアップメニュー処理時に、
「生成」項目が選択されたら変数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;//通常モードに...続きを読む

QGuiでGuiを操作

java の Gui 初心者です。


あるGUIのボタンを押したときに
他のGUIのデータを変える
というプログラムを考えています。

(たとえば
ステレオリモコンのGUIがあり、プラスボタンを押すと
ステレオのGUIにある JSlider(音量を表わす)が変わるなど)

Java Agent DEvelopment Framework(JADE)
を用いてやり取りをするのかとも考えましたが
もっと簡素なやり方があるのではと思い、質問いたしました。


ご存知の方いらっしゃいましたら

ボタンが押されたら処理をする(actionListener)中で
どのようにして他のGUIを操作するのか
という点を教えていただきたいです。

よろしくお願いいたします。

Aベストアンサー

jdk のdemo jdk/demo/jfc/SwingSet2/src/SliderDemo.java をまねて作ってみた。
GUI部分だけ提示します。あとは、これをJFrameやJAppletに載せれば動作します
import javax.swing.*;
import java.awt.event.*;// ActionListner
class SlideTest extends JPanel {
SlideTest(){
JButton bn;
JLabel sInfo = new JLabel( "SliderDemo.slidervalue");
JSlider slide = new JSlider( JSlider.HORIZONTAL, 0,100,50 )
SliderChanger listener = new SliderChanger(slide, sInfo);

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
bn = new JButton("slid +10" );
bn.addActionListener(listener);
bn.setActionCommand("10");
add(bn);

bn = new JButton("slid -10");
bn.addActionListener(listener);
bn.setActionCommand("-10");
add(bn);

add(slide);
add(sInfo);
}

class SliderChanger implements ActionListner {
JSlider s1 ;
JLabel info;
public SliderChanger(JSlider s, JLabel f) {
s1 = s;
info = f;
}
public void actionPerformed(ActionEvent ev) {
String action = ev.getActionCommand();
int value;
try{
value = Integer.parseInt(action);
}catch(Exception ex){
value = 0;
}
s1.setValue( s1.getValue()+value );
info.setText( "SliderDemo.slidervalue :" + s1.getValue());
}
}
}

jdk のdemo jdk/demo/jfc/SwingSet2/src/SliderDemo.java をまねて作ってみた。
GUI部分だけ提示します。あとは、これをJFrameやJAppletに載せれば動作します
import javax.swing.*;
import java.awt.event.*;// ActionListner
class SlideTest extends JPanel {
SlideTest(){
JButton bn;
JLabel sInfo = new JLabel( "SliderDemo.slidervalue");
JSlider slide = new JSlider( JSlider.HORIZONTAL, 0,100,50 )
SliderChanger listener = new SliderChanger(slide, sInfo);

setLayout(new BoxLayo...続きを読む

QJpanelにグラフを書くプログラム

質問させて頂きます。
今、ファイルから西暦、月、日、時間、そのときの温度、湿度を読み込んでグラフ表示するプログラムを作っています。そこで、Swingを使ってPanelを三つ作成し、一番上のPanelにグラフ、二番目にデータの日付を指定するJComboBoxボタン(何年何月何日等)、三番目にグラフ描画時の現在時刻を表示するプログラムを作っています。
そこで質問なんですが、一番目のPanelにグラフを表示する方法がわからなくて困っています。

これのPanel1に簡単な図を描く方法を教えていただければ自分でも考えられると思いますので、よろしくお願いします

Aベストアンサー

JPanelを継承したClassを作る方法で、一例を紹介します。


1. JPanelを継承した class を1つ作ります。(hizukeの下に書けばok)

public class hizuke extends JApplet implements ActionListener {
 ……
}

class MyGraphPanel extends JPanel {
}


2. 今までの p1 を このclassに変えます。

public class hizuke ... {

private MyGraphPanel p1; // <-------ココのclass変更

public void init(){
//********** JPanel **********************************/
p1 = new MyGraphPanel(); // <-------ココのclass変更


3. MyGraphPanelクラスに、hizukeクラスからデータをもらうpropertyを作成します。

class MyGraphPanel extends JPanel {

private int[] graphData = null;

void setGraphData(int[] graphData) {
this.graphData = graphData;
}

}

4. 実行ボタンが押されたら、データを渡してグラフ描画を依頼する命令を出します。

public class hizuke ... {
……
public void actionPerformed(ActionEvent e){
……

else if(e.getSource()==bt1) {
int[] graphData = {20, 24, 25, 26, 28, 24, 22, 18, 20, 22, 20, 17};
p1.setGraphData(graphData);
p1.repaint();
}

5. グラフを描画する処理をMyGraphPanelに入れます。

class MyGraphPanel extends JPanel {
……
public void paintComponent(Graphics g) {
super.paintComponent(g);

if (graphData == null) return;

Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.blue);

//棒グラフ
for (int i = 0; i < graphData.length; i++) {
g2.draw3DRect(0, i * 16, graphData[i] * 10, 10, false);
}
}
}

※jdkの\demoの配下にsampleが沢山あるので、それらも参考にしましょう

JPanelを継承したClassを作る方法で、一例を紹介します。


1. JPanelを継承した class を1つ作ります。(hizukeの下に書けばok)

public class hizuke extends JApplet implements ActionListener {
 ……
}

class MyGraphPanel extends JPanel {
}


2. 今までの p1 を このclassに変えます。

public class hizuke ... {

private MyGraphPanel p1; // <-------ココのclass変更

public void init(){
//********** JPanel **********************************/
...続きを読む

QSWTでグラフを書きたい

お世話になります。
SWTを使って収支をグラフかできるアプリを作りたいと思います。

しかしグラフ化する?というところでどのようにやったらいいか検討もつきません。
どのクラスをどのように使うのかがわかりません。
このクラスのAPIをみるといいよとか
ここのサンプルをみるといいよ
というのがありましたら教えてください。

グラフは画像としてではなく
グラフ上の任意の点にマウスをもってくると
その点の情報がでるような仕組みにしたいです。

宜しくお願い致します。

Aベストアンサー

かなりハードな仕事ですね。

なめとんのか!と怒られそうな回答ですが、あくまでもご参考に。。。

私が学校にいたとき、Javaで横長の棒グラフを書くという例題がありましたので、ご参考までに。。。

Labelクラスをひとつの棒グラフとし、setBackground(Color c)メソッドでグラフの色を指定し、setBound(x,y,width,len)メソッドで位置とグラフの大きさを決めます。でMouseListenerをつけておいて、mouseEnteredで、小さなダイアログボックスクラスを出すなんてのじゃ、駄目でしょうか?

なんしろ、グラフだけなら、何とでもなると思いますが、さいごの情報がでてくるというのが、むずかしい。

Q1つのグラフ内で複数の折れ線グラフを描きたい

ネット上でダウンロードしたスクリプトに手を加えて1つのグラフ内に複数の折れ線グラフを詰め込むプログラムを作っているのですが、私は初心者なのでなかなかうまくいきません。

http://park15.wakwak.com/~akutagawa/graph/graph.htm
こんな風にもう一つの折れ線グラフのデータをマーカーとラインで表示するところまではできているのですが、もう1つのデータの点と点を線で結ぶというところでつまづいています。
どうか助けていただけませんでしょうか?

graph-line.jsのソースは以下の様になってます。
http://park15.wakwak.com/~akutagawa/cgi-bin/graph-line-js.cgi
(一部半角の<divを全角の<divにしてます)

Aベストアンサー

スクリプトの内容は見てませんが・・・
 ここ( http://web-sozai.seesaa.net/article/17776494.html ) に
>PointPush(X,Y,Marker,Tiphelp);
>X=Yのデータを追加する。(左から順番に入れる必要があります。)
と書いてありますから、そういう仕様なのではないでしょうか。
どうしてもやりたければ、カスタマイズするしかないのでは?


似たようなもので、こんなのもありますが・・
 http://www.html5.jp/library/graph_line.html
(こちらは複数のグラフが可能みたい)


このカテゴリの人気Q&Aランキング

おすすめ情報