Javaの円グラフが描かれない理由

このQ&Aのポイント
  • Javaの円グラフが描かれない理由について説明します。
  • プログラムの中で指定されているパラメーターの値が原因で円グラフが描かれない場合があります。
  • 具体的には、paの各要素が-72で初期化されているため、描画されない問題が発生しています。
回答を見る
  • ベストアンサー

javaの円グラフがうまくいきません。

import java.applet.Applet; import java.awt.*; public class graph extends Applet{ public void paint(Graphics g){ int pa[] = new int[5]; int i,count; pa[0]=-72; pa[1]=-72; pa[2]=-72; pa[3]=-72; pa[4]=-72; count=5; int k=0; if(pa[k]<0){ pa[k]=0; } int t,sum=0; for(t=0;t<count;t++){ sum=sum+pa[t]; } int u,s=0; for(i=0;i<5;i++){ for(u=0;u<i;u++){ s=s+360*pa[i-1]/sum; // } g.setColor(new Color(200,50,200)); g.fillArc(100, 100, 300, 300, 90+s,pa[i]/sum*360); } } } 実行しても真っ白のままなにも描かれていません。 count=1にしてpa[0]の部分だけを描こうとしても無理でした。 直接-72と入れるとちゃんと描かれていました。 どうしてでしょうか?

noname#132976
noname#132976
  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

> pa[i]の割り算のところは、よくわかりません。 pa[i]=-72, sum=-360だとして、pa[i]/sum*360の計算を順番に考えてみましょう。 先に計算される部分にカッコをつけると(-72/-360)*360となりますが、カッコの中の割り算はこの場合整数演算なので結果は0です。0.2にはなりません。したがって、0*360=0となります。 > インターネットで(double)をつけるといいらしいのですが、つける場所がイマイチわかりません。 上の式でpa[i]とsumのどちらかをdoubleにキャストしてやれば、割り算の結果が0ではなく0.2になります。  整数 / 整数 → 整数  浮動小数点数 / 整数 → 浮動小数点数  整数 / 浮動小数点数 → 浮動小数点数  浮動小数点数 / 浮動小数点数 → 浮動小数点数 ただし、fillArc()は第6引数に浮動小数点数を受け付けないので、360を掛けた後にもう一度intにキャストする必要があります。 分解して書いてみます。yがfillArc()に渡す角度です。 double x = (double)pa[i]/sum; int y = (int)(x*360);

noname#132976
質問者

お礼

ありがとうございます。なんとか完成させることができますた。 pa[-1]の場合もif文で何とかできました。 本当に助かりました。

その他の回答 (2)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

ANo.1で「i=0のときにpa[i-1]を参照したら例外が発生します。」と書いたのは的外れだったので訂正します。i=0のときにはs=s+360*pa[i-1]/sum;は実行されません。 ただしiが1以上の時の開始角指定が正しくないので、for (u = 0; u < i; u++) { … }のループは消して、代わりにs=s+360*pa[i]/sum;をfillArc()の次の行に書くべきでしょう。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

int k=0; if(pa[k]<0){ pa[k]=0; } の部分の意図は何ですか? kは変化せず、またpa[0]=-72;で代入した値が0に変えられてしまいます。pa[0]の値を0にしたいのなら最初からpa[0]=0;とすればいいのでは? for(i=0;i<5;i++){ for(u=0;u<i;u++){ s=s+360*pa[i-1]/sum; // } i=0のときにpa[i-1]を参照したら例外が発生します。 g.fillArc(100, 100, 300, 300, 90+s,pa[i]/sum*360); pa[i]の型はintなので、先にsumで割ると0になってしまいます。

noname#132976
質問者

お礼

返答ありがとうございます。 int k=0; if(pa[k]<0){ pa[k]=0; } i=0のときの例外のために書いたと思われますが、改めて見るとおかしいですね(笑 pa[-1]の例外は普通にpa[-1]=0で大丈夫ですか? pa[i]の割り算のところは、よくわかりません。 割り算したときに、あまりは切り捨てられることといっしょですか? インターネットで(double)をつけるといいらしいのですが、つける場所がイマイチわかりません。

関連するQ&A

  • Javaを説明するには

    4枚の絵をパラパラアニメにするソースなのですが。これをわけ合って説明しなくてはならなくなってしまいました。 薄らぼんやりとはわかるのですが。どう説明したらいいのかさっぱり分かりません、どう説明すれば、分かりやすく正しく伝えられるでしょうか?>< import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class DNA extends Applet implements Runnable, ActionListener { Image image[] = new Image[4]; int[] timing = { 400,350,230,350}; Thread t; int index1 = 0; int no = 0; private static final long serialVersionUID = 1L; public void init(){ for(int i = 0; i<4; i++){ image[i] = getImage(getDocumentBase(),"img"+(i)+".gif"); } } public void paint(Graphics g){ g.drawImage(image[index1],0,0,this); } public void update(Graphics g) { paint(g); if(++no==4)no=0; } public void start(){ t = new Thread(this); t.start(); } public void run() { while(true){ index1++; if(index1 == 4){ index1 = 0; } repaint(); try{ Thread.sleep(timing[no]); }catch(InterruptedException e){} }} public void actionPerformed(ActionEvent arg0) { } }

  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • 平均値の出し方

    お世話になります。 Javaのアプレットを使ったプログラムを作成しているのですが、 どうしても表示がおかしくなってしまうのでお助けいただきたいのです。 まず、乱数で数字を10個表示させ、 その下にその平均値を出すというプログラムなのですが、 肝心の平均値が黒い四角で出てきてしまって 平均値が全く読めません(というか数字じゃない)。 エラーも出ていないので、どこがおかしいのかわからないのです。 なお、プログラムは以下のとおりです。 import java.awt.*; import java.applet.*; public class Average extends Applet{ public void paint(Graphics g){ int [] numbers = new int [10]; for (int i=0; i<numbers.length; i++){ numbers[i] = (int)(Math.random()*12+1); g.drawString(""+numbers[i], 30+30*i, 30); } int sum=0; int average; for (int i=0; i<numbers.length; i++){ sum = sum + numbers[i]; average = sum/10; g.drawString("平均値は,"+average, 30, 60); } } } まず適当に乱数で数字を10個表示し、 合計(sum)をとりあえず0としておいて、 合計に乱数の変数numbers[i]を10回足していくというつもりで書きました。 どなたかご教授いただけると助かります。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • java applet

    import java. applet.*; import java. awt. Button; import java. awt. Label; import java. awt. TextField; import java. awt. event.*; public class 1120 extends Applet implements ActionListener { private TextField box1 = new TextField(5); private TextField box2 = new TextField(5); private TextField box3 = new TextField(5); private Label moji1 = new Label(" と "); private Label moji2 = new Label(" の和は "); private Label moji3 = new Label(" である。 "); private Button ok = new Button("OK"); public void init() { resize( 320 , 240); add( box1 ); add( moji1 ); add( box2 ); add( moji2 ); add( box3 ); add( moji3 ); add( ok ); ok.addActionListener( this ); } public void actionPerformed( ActionEvent e ) { int i=0 ,j =0 , k; String t1 = box1.getText(); String t2 = box2.getText(); i = Integer.parseInt( t1 ); j = Integer.parseInt( t2 ); k = i + j; String s = Integer.toString( k ); box3. setText( s ); } } //上記のプログラムを書いたのですが、なぜかエラーが出てしまいます。勿論、自分でも見直しましたが、その理由がわかりませんでした。知識のある方、ご回答の方お願いします。

  • Java Applet での虫食い算での質問

    初めて利用させていただきます。 今、課題で虫食い算のプログラムを作成しているのですが、うまく動作してくれません。 もしよろしければご指摘をしてもらえればと思い書き込みのほうをさせていただきます。 import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Event; import java.awt.Font; import java.awt.Graphics; import java.awt.Panel; import java.applet.Applet; public class musikuizan_1 extends Applet { int A, B; int cnt; int sub(int n,int m) { int i; for (i=1; i<m; i++) n /= 10; return n % 10; } void puzzle() { int a; int b; int c; int d; int e; for (a=1; a<=99; a++) { for (b=1; b<=99; b++) { c = a * (b % 10); d = a * (b / 10); e = a * b; if (c>=100 && c<=999 && d>=10 && d<=99 && e>=100 && e<=999) /*桁数調整*/ { if (sub(b,1)==3 && sub(c,2)==1 && sub(d,2)==8) /*穴埋めされてある部分の数*/ { A = a; B = b; cnt++; } } } } } public void init() { setBackground(new Color(150,180,200)); setLayout(new BorderLayout()); Panel psouth = new Panel(); psouth.add(new Button("実行")); add("South", psouth); } public void paint(Graphics g) { int i, c, d, e; for (i=1; i<=2; i++) { g.drawRect(97-i*20, 5,16,16); g.drawRect(97-i*20,25,16,16); g.drawRect(77-i*20,65,16,16); } for (i=1; i<=3; i++) { g.drawRect(97-i*20,45,16,16); g.drawRect(97-i*20,85,16,16); } for (i=1; i<=4; i++) g.drawLine(30,43,100,43); g.drawLine(30,83,100,83); g.setFont(new Font("Helvetica",Font.BOLD,18)); g.drawString("x",40, 40); if (A == 0) { g.drawString("3",60, 40); g.drawString("1",60, 60); g.drawString("8",60, 80); g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.drawString("cnt = ",30,115); } else { c = A * (B % 10); d = A * (B / 10); e = A * B; g.setFont(new Font("Helvetica",Font.BOLD,18)); for (i=1; i<=2; i++) { g.drawString(Integer.toString(sub(A,i)),100-i*20, 20); g.drawString(Integer.toString(sub(B,i)),100-i*20, 40); } for (i=1; i<=3; i++) { g.drawString(Integer.toString(sub(c,i)),100-i*20, 60); g.drawString(Integer.toString(sub(d,i)), 80-i*20, 80); } for (i=1; i<=4; i++) g.drawString(Integer.toString(sub(e,i)),100-i*20,100); g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.drawString("cnt = "+Integer.toString(cnt),30,115); } } public boolean action(Event e, Object arg) { if ("実行".equals(arg)) { if (A == 0) puzzle(); else A = cnt = 0; repaint(); } return true; } }

    • ベストアンサー
    • Java
  • javaアプレットでのy=x^2のグラフ

    javaアプレットでy=x^2のグラフを描写したいのですが、現在の状態ではグラフの右側しか画面に現れません。軸の移動をすればよいと思うのですが、どのように修正すればよいのでしょうか? import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; public class test1 extends Applet{ public void paint(Graphics g){ g.setColor(Color.red); int x,yp=100,xp=0; for(x=0;x<200;x++){ int y=(int)(x*x)*(-1)+100; g.drawLine(xp,yp,x,y); xp = x; yp = y; } } }

  • javaで配列の格納をしたいです。

    配列の格納がうまくいきません。 javaについて質問させて頂きます。 ユーザーが数字を入力し配列 atr[ i ]に格納され 配列 v[ i ] に v[ 0 ] = count ... v[ 143 ] = count ... v[ 144 ] = count - 1 ... v[ 287 ] = count - 1 ... ... v[ count-288 ] = 2 ... v[ count-145 ] = 2 ... v[ count-144 ] = 1 ... v[ count-1 ] = 1 と、格納されるようなプログラムを作っています。 for文で作ろうと考えたのですが count, count-1 , ... 3, 2, 1と値を入れようと思いましたがうまくコンパイルが通りませんでした。 エラーは以下になります。 a.java:48: シンボルを見つけられません。 シンボル: メソッド readLine(int) 場所 : java.io.BufferedReader の クラス value = br_v.readLine(atr[i]); もし宜しければアドバイスやご指摘を頂けませんでしょうか。 説明も拙い部分がありますが宜しければお願いします。 import java.io.*; import java.util.Arrays; class a { public static void main(String[] args) throws IOException { int atr[]; atr = new int[25]; int count = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true){ //絶対に通る String str = br.readLine(); int res = Integer.parseInt(str); if(res == 0){ break; } else{ atr[count] = res; } count++; } for(int i=0; i<count; i++){ System.out.println(atr[i] + "が、選択されました。"); } int v[] = new int[25*144]; String value; try{ BufferedReader br_v = new BufferedReader(new InputStreamReader(System.in)); for(int i=count; i<count; i--){ value = br_v.readLine(atr[i]); v[i] = Integer.parseInt(value); } } catch(IOException e){ System.out.println("エラーです。"); } } }

  • JAVAの初歩でとても悩んでます・・

    JAVAについての質問があります。とても困ってます・・。初心者の自分にもわかるようそれぞれの番号に対しての説明をしていただけると嬉しいです。 ちょっと長いのですが、例文があったのでそれを書いておきます。 (1)「メディアストラッカー」 (2)「スレッド」 (3)「インプリメント」 (4)myMt.waitForID(0) (5)myMT.checkID(0) (6)myTh = null; import java.applet.*; import java.awt.*; public class Lesson19 extends Applet implements Runnable{ Image[] myImg; int myNo; MediaTracker myMt; //メディアトラッカーオブジェクト Thread myTh; //スレッド public void init() { int count; myImg = new Image[3]; myNo = 0; myMt = new MediaTracker(this); myTh = null; for (count = 0; count < 3; count++) { myImg[count] = getImage(getDocumentBase(), "image" + count + ".gif"); myMt.addImage(myImg[count], 0); } } public void start(){ if (myTh == null) { myTh= new Thread(this); myTh.start(); } } public void run() { try { myMt.waitForID(0); } catch(InterruptedException e) {} while (true) { myNo = myNo + 1; if (myNo== 3) myNo = 0; try { myTh.sleep(1000); } catch(InterruptedException e) {} repaint(); } } public void paint(Graphics g) { if (myMt.checkID(0)) g.drawImage(myImg[myNo], 80, 80, this); g.drawString("image" + myNo, 75, 50); } }

    • ベストアンサー
    • Java
  • Javaで四角をつくったのですが・・・

    とりあえずこの文をみてください。 import java.applet.Applet; import java.awt.*; public class Face extends Applet { public final static int step = 2; public final static int x0rg = 10; public final static int y0rg = 20; public void paint(Graphics g){ for(int i = 0; i < 3; i++) { for(int j = 0; j < 1; j++) { drawFace(g, x0rg + 18 * step * i, y0rg + 18 * step * j); } } drawFace(g, x0rg, y0rg); } void drawFace(Graphics g, int xStart, int yStart) { drawFrame(g, xStart, yStart); } void drawFrame(Graphics g, int xStart, int yStart) { g.drawRect(xStart, yStart, 16 * step, 16 * step); } } とこのような命令で四角を作ったとき、四角が三つ表示されるのですが、ここから一つ目(一番左の四角)の四角の二倍の大きさの箱を二つ目の四角に、さらに三つ目の四角はその二倍にしたいのですがどのようにすればできるのでしょうか?ようするに右にいくごとに二倍にしていきたいのです。 どうかお願いします。

    • ベストアンサー
    • Java
  • javaアプレット repaintのタイミング

    勉強を始めたばかりなので稚拙な質問ですがお許しください。 ユーザーからの入力→repaint→画面に反映→プログラムが処理→repaint→画面に反映 というターン制のような動かし方をしたいのですが、実際にはユーザーの入力の後、プログラムの処理を待ってからまとめてrepaintしてしまいます。 repaint()は再描画を要求しているだけに過ぎず、repaint()と書いた場所で即時に再描画されるわけではないそうですが、では具体的にすぐ再描画してほしい場合はどうすればいいのでしょうか? 例えばですが、「ボタンを押すとcountの値が+1され、四角がcount個描画される。その一秒後に、こちらが何もしなくてもcountが+2されてもう一度四角がcount個(つまりこの時点で合計三個)描画される」というのを作ってみました。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class question extends Applet implements ActionListener{ Button bt1; int count = 0; public void init(){ bt1 = new Button("start"); add(bt1); bt1.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource() == bt1) { bt1.setEnabled(false); count += 1; repaint(); try { Thread.sleep(1000); } catch (InterruptedException e1) { } count += 2; repaint(); bt1.setEnabled(true); } } public void paint(Graphics g){ for(int i = 0; i < count; i++){ g.drawRect(10, 10, 10 + i * 5, 10 + i * 5); } } } これではボタンを押すたびに3つずつ四角が増えているように外見上見えてしまいます。 ボタンを押すとしっかり1つ四角を表示してから一秒待って、2つ四角を増やす。という風にするためにはどうすればよいのでしょうか? どなたかご教示ください。 ちなみにpaintImmediatelyというものを見つけましたが、何故か使えず……(メソッドpaintImmediatelyは未定義ですと言われてしまう)

    • ベストアンサー
    • Java

専門家に質問してみよう