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

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

ただいまの
回答率

90.51%

  • Java

    15822questions

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

  • 配列

    611questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • Swing

    248questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

  • ArrayList

    104questions

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

Java GUIイベント内でのArrayListのadd 上書き対処法

解決済

回答 2

投稿 編集

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

HelpfulJp

score 10

JavaのGUIで、
ラベルをクリックしたら長さ9の配列MBに値を格納するよう作っています。
ラベル番号L[0]~L[8]と配列番号MB[0]~MB[8]は対応していて
MBの各indexにデータは格納できています。(確認済み)

しかし、毎度各ラベルを押すたびに配列MBが更新されるのですが
更新のたびにInteger[]型のArrayListのbmsに配列MBをaddすると以前記録した
Integer[]ArrayList内のデータが上書きされてしまいます。

GUIのイベント内でArrayListが上書きされない対処法を教えてください。

※インスタンスが原因だと思うのですが対処法がわかりませんでした。
いちおう下記の対処法も試みましたがダメでした。

ラベルイベント内の失敗した対処法:例1

L[0].addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        MB[0] = 1;
        ArrayList<Integer[]> bms1 =(ArrayList<Integer[]>)bms.clone();
        bms.clear();
        ArrayList<Integer[]> bms=(ArrayList<Integer[]>) bms1.clone();
            bms.add(MB);
        }
});

ラベルイベント内の失敗した対処法:例2

L[0].addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        MB[0] = 1;
         Integer[] MB1=new Integer[9];
                MB1=MB;
            bms.add(MB1);
        }
});
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

例2がおしいところまでいってますね。

MB1=MB;

という箇所が問題です。

おそらく、「MBの内容をMB1にコピーする」という意図なのかと推測しますが、

これはそのようには動作しません。

MBに対し、MB1という別名を付けただけとなります。

つまり、その前の行である、

Integer[] MB1=new Integer[9];

は上書きされています。

配列をコピーする場合は、

System.arraycopy

というメソッドがありますので、これを使ったものに書き換えて下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/10 01:34

    夜分遅くに回答ありがとうございます!arraycopyは便利ですね。
    メソッド紹介ありがとうございます!!

    キャンセル

+1

2つ目の失敗例を以下のように書き換えればいいです。

Integer[] MB1=new Integer[9];
for (int i = 0; i < 9; i++) {
    MB1[i]=MB[i];
}
bms.add(MB1);


Javaの配列は、参照型です。
「MB1=MB」はMBの参照をMB1に代入、「bms.add(MB);」は、bmsにMBの参照を追加しています。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/10 01:33 編集

    夜分遅くに回答ありがとうございます!とてもわかりやすい例で助かりました!

    キャンセル

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

  • Java

    15822questions

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

  • 配列

    611questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • Swing

    248questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

  • ArrayList

    104questions

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