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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

ArrayList

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

Q&A

解決済

1回答

1592閲覧

ArrayListのデータがおかしい

Alpa

総合スコア80

Java

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

ArrayList

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

0グッド

0クリップ

投稿2018/03/28 14:49

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

java

1import javax.swing.*; 2import java.awt.*; 3import java.awt.event.*; 4import java.util.*; 5 6public class SandBox extends JFrame implements KeyListener 7{ 8 9 int player_X = 10; 10 int player_Y = 40; 11 12 ArrayList<Block> Blocks = new ArrayList<Block>(); 13 14 Color SelectColorNow = Color.white; 15 16 Random rand = new Random(); 17 18 public static void main(String[] args) 19 { 20 SandBox Frame = new SandBox(); 21 Frame.setTitle("サンドボックス"); 22 Frame.setSize(800, 600); 23 Frame.setLocationRelativeTo(null); 24 Frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 25 Frame.setResizable(false); 26 Frame.setAlwaysOnTop(false); 27 Frame.setVisible(true); 28 } 29 30 SandBox() 31 { 32 JPanel Panel = new JPanel(true); 33 Panel.setLayout(null); 34 35 addKeyListener(this); 36 37 getContentPane().add(Panel, BorderLayout.CENTER); 38 } 39 40 public void paint(Graphics g) 41 { 42 clearBack(g); 43 44 drawBlock(g); 45 46 drawSelectColor(g); 47 drawPlayer(g); 48 } 49 50 public void keyReleased(KeyEvent e){} 51 public void keyPressed(KeyEvent e) 52 { 53 switch(e.getKeyText(e.getKeyCode())){ 54 case "Esc":{ 55 System.exit(0); 56 }break; 57 58 case "W":{ 59 if(player_Y >= 50){ 60 player_Y -= 10; 61 repaint(); 62 } 63 }break; 64 65 case "S":{ 66 if(player_Y <= 570){ 67 player_Y += 10; 68 repaint(); 69 } 70 }break; 71 72 case "A":{ 73 if(player_X >= 20){ 74 player_X -= 10; 75 repaint(); 76 } 77 }break; 78 79 case "D":{ 80 if(player_X <= 770){ 81 player_X += 10; 82 repaint(); 83 } 84 }break; 85 86 case "スペース":{ 87 addBlockData(); 88 repaint(); 89 }break; 90 91 case "上":{ 92 if(SelectColorNow == Color.white){ 93 SelectColorNow = Color.black; 94 }else if(SelectColorNow == Color.red){ 95 SelectColorNow = Color.white; 96 }else if(SelectColorNow == Color.blue){ 97 SelectColorNow = Color.red; 98 }else if(SelectColorNow == Color.green){ 99 SelectColorNow = Color.blue; 100 }else if(SelectColorNow == Color.yellow){ 101 SelectColorNow = Color.green; 102 }else if(SelectColorNow == Color.black){ 103 SelectColorNow = Color.yellow; 104 } 105 106 repaint(); 107 }break; 108 109 case "下":{ 110 if(SelectColorNow == Color.white){ 111 SelectColorNow = Color.red; 112 }else if(SelectColorNow == Color.red){ 113 SelectColorNow = Color.blue; 114 }else if(SelectColorNow == Color.blue){ 115 SelectColorNow = Color.green; 116 }else if(SelectColorNow == Color.green){ 117 SelectColorNow = Color.yellow; 118 }else if(SelectColorNow == Color.yellow){ 119 SelectColorNow = Color.black; 120 }else if(SelectColorNow == Color.black){ 121 SelectColorNow = Color.white; 122 } 123 124 repaint(); 125 }break; 126 127 case "右":{ 128 SelectColorNow = (new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256))); 129 repaint(); 130 }break; 131 132 case "左":{ 133 SelectColorNow = (new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256))); 134 repaint(); 135 }break; 136 137 case "Enter":{ 138 SelectColorNow = Color.white; 139 repaint(); 140 }break; 141 142 case "Q":{ 143 msl("X:" + player_X); 144 msl("Y:" + player_Y); 145 msl("色:" + SelectColorNow); 146 msl("ブロックデータ数:" + Blocks.size()); 147 148 for(int i = 0; i < Blocks.size(); i++){ 149 msl((i + 1) + "個目"); 150 msl("X:" + Blocks.get(i).x); 151 msl("Y:" + Blocks.get(i).y); 152 msl("色:" + Blocks.get(i).c); 153 msl("ID:" + Blocks.get(i).randomID); 154 msl(); 155 } 156 }break; 157 } 158 } 159 public void keyTyped(KeyEvent e){} 160 161 //以下描画メソッド 162 163 public void clearBack(Graphics g) 164 { 165 g.setColor(Color.black); 166 g.fillRect(0, 0, 800, 600); 167 } 168 169 public void drawPlayer(Graphics g) 170 { 171 g.setColor(new Color(40, 190, 255)); 172 g.drawRect(player_X, player_Y, 10, 10); 173 } 174 175 public void drawBlock(Graphics g) 176 { 177 for(int i = 0; i < Blocks.size(); i++){ 178 g.setColor(Blocks.get(i).c); 179 g.fillRect(Blocks.get(i).x, Blocks.get(i).y, 10, 10); 180 } 181 } 182 183 public void drawSelectColor(Graphics g) 184 { 185 if(SelectColorNow != Color.black){ 186 g.setColor(SelectColorNow); 187 g.fillRect(760, 560, 10, 10); 188 }else{ 189 g.setColor(SelectColorNow); 190 g.fillRect(760, 560, 10, 10); 191 g.setColor(Color.white); 192 g.drawRect(760, 560, 10, 10); 193 } 194 } 195 196 //以下内部処理メソッド 197 198 public void addBlockData() 199 { 200 Blocks.add(new Block(player_X, player_Y, SelectColorNow, rand.nextInt(100000))); 201 } 202 203 //以下記述簡易メソッド 204 205 public void msl(Object o) 206 { 207 System.out.println(o); 208 } 209 210 public void msl() 211 { 212 System.out.println(); 213 } 214 215} 216 217class Block 218{ 219 220 static int x = 0; 221 static int y = 0; 222 static Color c = Color.black; 223 static int randomID = 99999; 224 225 public Block(int x, int y, Color c, int id) 226 { 227 this.x = x; 228 this.y = y; 229 this.c = c; 230 this.randomID = id; 231 } 232 233}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

Java

1class Block 2{ 3 4 int x = 0; 5 int y = 0; 6 Color c = Color.black; 7 int randomID = 99999; 8 9 public Block(int x, int y, Color c, int id) 10 { 11 this.x = x; 12 this.y = y; 13 this.c = c; 14 this.randomID = id; 15 } 16 17}

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

投稿2018/03/28 14:53

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alpa

2018/03/28 14:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問