質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Java

    16139questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • ArrayList

    106questions

    Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

ArrayListのデータがおかしい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 386

Alpa

score 24

ArrayListにクラスを入れて
そのデータをArrayListに追加して
そのデータを参照して矩形を描画しているのですが
なぜか一つ追加した後に別の場所に移動して
追加すると全てデータが移動後のものに置き換わってしまいます
どのようにしたら直るでしょうか?
そしてなぜこのようになるのでしょうか?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class SandBox extends JFrame implements KeyListener
{

    int player_X = 10;
    int player_Y = 40;

    ArrayList<Block> Blocks = new ArrayList<Block>();

    Color SelectColorNow = Color.white;

    Random rand = new Random();

    public static void main(String[] args)
    {
        SandBox Frame = new SandBox();
        Frame.setTitle("サンドボックス");
        Frame.setSize(800, 600);
        Frame.setLocationRelativeTo(null);
        Frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        Frame.setResizable(false);
        Frame.setAlwaysOnTop(false);
        Frame.setVisible(true);
    }

    SandBox()
    {
        JPanel Panel = new JPanel(true);
        Panel.setLayout(null);

        addKeyListener(this);

        getContentPane().add(Panel, BorderLayout.CENTER);
    }

    public void paint(Graphics g)
    {
        clearBack(g);

        drawBlock(g);

        drawSelectColor(g);
        drawPlayer(g);
    }

    public void keyReleased(KeyEvent e){}
    public void keyPressed(KeyEvent e)
    {
        switch(e.getKeyText(e.getKeyCode())){
            case "Esc":{
                System.exit(0);
            }break;

            case "W":{
                if(player_Y >= 50){
                    player_Y -= 10;
                    repaint();
                }
            }break;

            case "S":{
                if(player_Y <= 570){
                    player_Y += 10;
                    repaint();
                }
            }break;

            case "A":{
                if(player_X >= 20){
                    player_X -= 10;
                    repaint();
                }
            }break;

            case "D":{
                if(player_X <= 770){
                    player_X += 10;
                    repaint();
                }
            }break;

            case "スペース":{
                addBlockData();
                repaint();
            }break;

            case "上":{
                if(SelectColorNow == Color.white){
                    SelectColorNow = Color.black;
                }else if(SelectColorNow == Color.red){
                    SelectColorNow = Color.white;
                }else if(SelectColorNow == Color.blue){
                    SelectColorNow = Color.red;
                }else if(SelectColorNow == Color.green){
                    SelectColorNow = Color.blue;
                }else if(SelectColorNow == Color.yellow){
                    SelectColorNow = Color.green;
                }else if(SelectColorNow == Color.black){
                    SelectColorNow = Color.yellow;
                }

                repaint();
            }break;

            case "下":{
                if(SelectColorNow == Color.white){
                    SelectColorNow = Color.red;
                }else if(SelectColorNow == Color.red){
                    SelectColorNow = Color.blue;
                }else if(SelectColorNow == Color.blue){
                    SelectColorNow = Color.green;
                }else if(SelectColorNow == Color.green){
                    SelectColorNow = Color.yellow;
                }else if(SelectColorNow == Color.yellow){
                    SelectColorNow = Color.black;
                }else if(SelectColorNow == Color.black){
                    SelectColorNow = Color.white;
                }

                repaint();
            }break;

            case "右":{
                SelectColorNow = (new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)));
                repaint();
            }break;

            case "左":{
                SelectColorNow = (new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)));
                repaint();
            }break;

            case "Enter":{
                SelectColorNow = Color.white;
                repaint();
            }break;

            case "Q":{
                msl("X:" + player_X);
                msl("Y:" + player_Y);
                msl("色:" + SelectColorNow);
                msl("ブロックデータ数:" + Blocks.size());

                for(int i = 0; i < Blocks.size(); i++){
                    msl((i + 1) + "個目");
                    msl("X:" + Blocks.get(i).x);
                    msl("Y:" + Blocks.get(i).y);
                    msl("色:" + Blocks.get(i).c);
                    msl("ID:" + Blocks.get(i).randomID);
                    msl();
                }
            }break;
        }
    }
    public void keyTyped(KeyEvent e){}

    //以下描画メソッド

    public void clearBack(Graphics g)
    {
        g.setColor(Color.black);
        g.fillRect(0, 0, 800, 600);
    }

    public void drawPlayer(Graphics g)
    {
        g.setColor(new Color(40, 190, 255));
        g.drawRect(player_X, player_Y, 10, 10);
    }

    public void drawBlock(Graphics g)
    {
        for(int i = 0; i < Blocks.size(); i++){
            g.setColor(Blocks.get(i).c);
            g.fillRect(Blocks.get(i).x, Blocks.get(i).y, 10, 10);
        }
    }

    public void drawSelectColor(Graphics g)
    {
        if(SelectColorNow != Color.black){
            g.setColor(SelectColorNow);
            g.fillRect(760, 560, 10, 10);
        }else{
            g.setColor(SelectColorNow);
            g.fillRect(760, 560, 10, 10);
            g.setColor(Color.white);
            g.drawRect(760, 560, 10, 10);
        }
    }

    //以下内部処理メソッド

    public void addBlockData()
    {
        Blocks.add(new Block(player_X, player_Y, SelectColorNow, rand.nextInt(100000)));
    }

    //以下記述簡易メソッド

    public void msl(Object o)
    {
        System.out.println(o);
    }

    public void msl()
    {
        System.out.println();
    }

}

class Block
{

    static int x = 0;
    static int y = 0;
    static Color c = Color.black;
    static int randomID = 99999;

    public Block(int x, int y, Color c, int id)
    {
        this.x = x;
        this.y = y;
        this.c = c;
        this.randomID = id;
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Blockの各フィールドが静的なので、全てのインスタンスで値が共有されてしまいます。
非staticにしてください。

class Block
{

    int x = 0;
    int y = 0;
    Color c = Color.black;
    int randomID = 99999;

    public Block(int x, int y, Color c, int id)
    {
        this.x = x;
        this.y = y;
        this.c = c;
        this.randomID = id;
    }

}

また本来ならそれぞれprivate finalだと良いでしょうね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/28 23:58

    なるほど!
    共有してしまっていたのですね!
    ありがとうございます!

    キャンセル

同じタグがついた質問を見る

  • Java

    16139questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • ArrayList

    106questions

    Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。