67606


（以下のプログラムで、Circleクラスの円をパネルに描くプログラムは実行するのですが、Fillクラスの三角形をパネルに描くプログラムが実行されません。（エラーは出ず、プログラム自体は正常に実行されるのですが、Fillクラスの三角形がパネルに表示されません）  
どこがおかしいのでしょうか？ わかりやすく教えていただれば幸いです。（コメントアウトの部分は無視してください））←解決済みです。

追加で質問です。  
Circleクラスでいくつかの自前のインスタンスメソッドを定義しました。以下です。

[code]

    public void o(Color c) {
        col = c;
    }
    
[/code]

その中に個別に色を指定するメソッドを作り、circles[2].o(Color.RED)とした所、問題なく赤色に変わりました。しかし不思議なのは、なぜsetColorではなく、oという自分で定義したメソッド名で、色が変わるのでしょうか？setClorメソッドでないと色が変わらないと思うのですが。  
というのも、

[code]

    public void draw(Graphics g) {
        g.setColor(col);
        g.fillOval(xpos-rad, ypos-rad, rad*2, rad*2);
    }
    
[/code]

この部分でメソッドsetColorを、別の任意のメソッド名（例えばo）に変えてもエラーが出て実行されないからです。エラー内容は、「シンボル（メソッド
i(Color)）を見つけられません」と表示されます。  
この両者の違いはなんでしょうか？

[code]

    import java.awt.*;
    import javax.swing.*;
    
    //import sun.java2d.loops.FillPath;
    
    public class Sample84 extends JPanel {
      int n = 20;
      Circle[] circles = new Circle[n];
      Fill a=new Fill(Color.RED,20,50,65,100,140,100,3);
      //int p=20;
      //Fill[] fills = new Fill[p];
    
     public Sample84() {
        for (int i = 0; i<n ; ++i) {
          circles[i] = new Circle(Color.BLUE, 30+60*i, 100, 15+1*i);
        }
      }
    
      public void paintComponent(Graphics g) {
        circles[2].o(Color.RED);
        circles[2].setRad(10);
        circles[3].disappear();
        circles[7].moveTo(30,30); circles[7].randomColor();
        a.draw(g);
    
       // fills[8].fillPolygon(g);
    
       // circles[8].fillPolygon(x1=10;x2=40;x3=50;y1=21;y2=40;y3=50;n=3);
       // circles[12].moveTo(circles[12].xpos+30,circles[12].ypos+70); circles[12].randomColor();
       // circles[17].moveBy(30,70); circles[17].randomColor();
    
        for (int i = 0; i < n; ++i) {circles[i].draw(g); }
      }
    
      public static void main(String[] args) {
        JFrame app = new JFrame();
        app.add(new Sample84());
        app.setSize(880, 300);
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        app.setVisible(true);
      }
      static class Circle {
        Color col;
        int xpos, ypos, rad,n, x1,x2,x3,y1,y2,y3;
        //int []trix;int[]triy;
        public Circle(Color c, int x, int y, int r) {
          col = c; xpos = x; ypos = y; rad = r;
        }
    
    
       public void o(Color c) {
         col = c;
        }
        public void randomColor() {
          col = new Color((float)Math.random(),(float)Math.random(),(float)Math.random());
        }
        public void moveTo(int x, int y) {
          xpos = x; ypos = y;
        }
        public void moveBy(int x, int y) {
          xpos = xpos + x; ypos = ypos + y;
        }
        public void draw(Graphics g) {
          g.setColor(col);
          g.fillOval(xpos-rad, ypos-rad, rad*2, rad*2);
        }
    
        public void setRad(int ra ){rad=rad+ra;}
    
    
       public void disappear()
       {col=new Color(0,0,0,0);}
    
    
    }
    
    static class Fill{
    int x1;int x2;int x3;int y1;int y2;int y3;int o; 
    Color color;
    int[]trix=new int[]{x1,x2,x3};
    int[]triy=new int[]{y1,y2,y3};
        public Fill(Color color,int x1,int x2,int x3,int y1,int y2,int y3,int o){
          this.x1=x1;this.x2=x2;this.x3=x3;this.y1=y1;this.y2=y2;this.y3=y3;this.o=o;
        }
    
        public void draw(Graphics g){
          g.setColor(color);
          g.drawPolygon(trix,triy,o);
        }
    
    
    
    
    }
    
    }
    
[/code]


CC BY-SA 4.0
2020-06-12T09:01:12.830
67575
2020-06-13T10:04:48.560
2020-06-13T06:07:58.460
3060
39688
question
java
インスタンスメソッドを作る際、どんなメソッドであっても、メソッドの名前は任意で作ってもいいのでしょうか？


### 編集前の質問への回答

クラス変数`trix`と`triy`の宣言時に配列を初期化していることが原因です。  
これによって`Fill`クラスのコンストラクタで座標を渡す前に配列内部のint型の値が決定してしまいます。  
つまり座標(0, 0)に描画していることになります。

int型の配列は初期化や代入時に **変数の値をコピー** するので、その後に変数を書き換えても配列内部の値は変わりません。  
コードで表すと下記のイメージです。

[code]

    int x1, x2, x3;  //初期化時の値は0
    int[] trix = new int[]{x1, x2, x3}; // {0, 0, 0}の値で配列が初期化される
    
    public Fill(int x1) {
        this.x1 = x1;  //trix内部の値は変わらない(0のまま)
    }
    
[/code]

コンストラクタの末尾(またはdrawメソッド)で配列を初期化することで対応できます。

[code]

    static class Fill {
        //略
        int[] trix;
        int[] triy;
        public Fill(Color color, int x1, int x2, int x3, int y1, int y2, int y3, int o) {
            this.color = color;
            //略
            this.trix = new int[]{x1, x2, x3};
            this.triy = new int[]{y1, y2, y3};
        }
        //略
    }
    
[/code]

* * *

### コメントへの回答

> 気になる点として、なぜ「this.trix=trix」のように、thisを使うのでしょうか？普通に「trix=trix」とすればいいと思います。

どうぞ。  
私がご提示したサンプルコードに限って言えば`this.trix`の`this`は普通に省略していただいて構いません。  
単純にコードの整形とクラスのメンバ変数への代入であることを明示する目的で[`this`](https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html)キーワードを使用しています。

### 追加質問への回答

> なぜsetColorではなく、oという自分で定義したメソッド名で、色が変わるのでしょうか？

自分で定義したメソッド名`o`の中でメンバ変数の`col`を書き換えているから結果的に色が変わります。  
`g.setColor(col);`を`g.o(col);`に書き換えると動かない理由は、変数`g`の[`Graphics`クラス](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/java/awt/Graphics.html)に[`setColor`メソッド](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/java/awt/Graphics.html#setColor\(java.awt.Color\))が用意されていないからです。

ご質問の`Circle`クラスで、インスタンスメソッド`public void o(Color
c)`を宣言した(なおかつ`Circle`クラスに`setColor`メソッドを宣言していない)状態で下記のコードを書いてもエラーになりますよね？

[code]

    circles[2].setColor(Color.RED);
    
[/code]

なぜなら`Circle`クラスには`setColor`メソッドが用意されていないからです。  
同様に`Graphics`クラスにも用意されているメソッドと用意されていないメソッドがあり、たまたま色を指定するメソッド名が`setColor`であるので、そのメソッドを適切に呼べば色が変わりますし、用意されていない`o`メソッドや`i`メソッドを呼び出しても「そんなメソッドは見つかりません」エラーが発生します。

### 追加質問のやり方

スタックオーバーフローは質問者に利するためにとどまらず、他に類似の懸案で困っている技術者や学習者にも[役立つための](https://ja.stackoverflow.com/help)QAサイトです。  
そのため一つの質問が解決した時に発生した質問はコメントや質問を編集するのではなく、新しい質問を作成するようお願いいたします。  
そうでないと編集後の質問を求めてこのページにたどり着いた方にとって、回答者の私は「質問にそぐわない回答をした人」に見えてしまいます。


CC BY-SA 4.0
2020-06-12T23:57:00.023
67606
2020-06-13T10:04:48.560
2020-06-13T10:04:48.560
9820
9820
67575
answer