こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

java 格納した乱数それぞれにボタンを付け配置

2回目の質問させて頂きます。
java勉強中の初級者です。

前回乱数を重複させずに5行×5列の25個並べる方法を教えて頂きました。
この25個にボタンをつけて最終的にタッチナンバーのゲームを作りたいです。
(ランダムに並んだ数字1~25まで順番に押してくゲーム)

5行×5列のボタンを配置まではできたのですが、
(1)そのボタンそれぞれに毎回違う乱数と紐付ける方法
(2)1~25まで順番に押してく処理
(3)そのボタンにその都度の数字に合わせた画像を付ける方法(押したら押された時用の画像に変わる)

上の3つが今悩んでいて、今回お聞きしたいところです。

(2)はifを使って
『25は24を押した後じゃないと押せない、24は23を押した後じゃないと押せない。』
みたいに一つずつ処理していくのかなぁと言うイメージです。
(合ってるのか効率いいのかもわかりませんが。)

(3)はこの数字が来たらこの画像、あらかじめ指定しておくのかな?と言うイメージです。
(これも合ってるのかすらわかりません。)

前回教えて頂いたソースコードを載せておきます。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Formatter;
import java.util.List;

class RandomArray {
public static void main(String[] args) {
int n = 5;
int[][] a = new int[n][n];
List<Integer> shuffled = new ArrayList<Integer>();
// initialize
for (int i = 0; i < n * n; i++)
shuffled.add(i + 1);
// shuffle
Collections.shuffle(shuffled);
System.out.println("shuffled: " + shuffled);
// set
int c = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
a[i][j] = shuffled.get(c++);
// output
StringBuilder sb = new StringBuilder();
Formatter f = new Formatter(sb);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
f.format("%2d ", a[i][j]);
f.format("\n");
}
System.out.print(f);
}
}


やりかた、考え方でもありがたいのですが、ソースコードも教えて頂けたら大変ありがたいです。
ぜひご教授頂きたいです。
よろしくお願いします。

投稿日時 - 2014-08-13 12:04:45

QNo.8715271

困ってます

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

補足への回答です。
たぶん、それで良いです。もしかしたら、try-catch で挟まないといけないかもしれませんが。(ファイル入力があるため)
今のところ、画像ファイルはソースと同じフォルダに置きます。
ボタンは、コンストラクタに、数字が指定されて初期化されるので、
半自動的に画像ファイルの名前を選択しています。
当然、その画像ファイルは自前で用意する必要があります。これが一番面倒だと思います。

投稿日時 - 2014-08-14 18:04:13

お礼

何度も教えて頂きありがとうございました!

ここまで教えて頂いたので、あとはがんばってやってみます!
ありがとうございました!

投稿日時 - 2014-08-15 08:17:56

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

 横から失礼します

>1.png、2.png、...25.png
>1_off.png、2_off.png、... 25_off.png
>というのはどの部分に入れていくのでしょうか。

 JButton には

setIcon
setPressedIcon
setSelectedIcon
setRolloverIcon
setRolloverSelectedIcon
setDisabledIcon
setDisabledSelectedIcon

 など、Iconを設定する細かいメソッドがたくさんありますので、それらを活用した方が簡単だと思いますよ

投稿日時 - 2014-08-15 08:08:34

お礼

ご回答ありがとうございます!

そちらのメソッド調べてしてみます!
何度も教えてくださった方がいるのでそちらの方をベストアンサーにさせて頂きました。

また何かで質問を出すと思いますので機会がありましたらよろしくお願いします。

投稿日時 - 2014-08-15 08:20:01

ANo.2

画像ファイルがないので、試していませんが。
JButton のコンストラクタに、
new JButton(Icon icon)
というのがあるので、
super("" + number);
を、
super(new ImageIcom("" + number + ".png"));
のように変更すれば良いと思います。この場合、1.png、2.png、...
を、アイコン画像として使用します。
同じように、マウスクリック時のアクションを登録しているところで、
バックグラウンドの色を変更するのではなく、
b.setIcon(new ImageIcon("" + number + "_off.png"));
とします。1_off.png、2_off.png、... の画像に変更するわけです。

投稿日時 - 2014-08-14 16:39:00

補足

public void mouseClicked(MouseEvent e) {
if (pressed[b.getNumber() - 1]) {
b.setIcon(new ImageIcon("" + number + "_off.png"));
b.setEnabled(false);
pressed[b.getNumber()] = true;
}
}

public NumberdButton(int number) {
super(new ImageIcom("" + number + ".png"));
this.number = number;
}
でよいのでしょうか。

1.png、2.png、...25.png
1_off.png、2_off.png、... 25_off.png
というのはどの部分に入れていくのでしょうか。

質問ばかりで恥ずかしいですが、ご教授お願いします。

投稿日時 - 2014-08-14 17:28:07

ANo.1

GUI はあまり得意ではありません。
例えば、こんな感じでしょうか。
PressButtonToOrder.java という名前で保存します。
http://pastebin.com/dYWqH0Wq

private boolean[] pressed = new boolean[5 * 5 + 1];
というのが工夫で、pressed[0] = true; 以降の添字は false
にしておいて、ボタンの数字を添え字と照合して、
pressed[前の数字] == true の時だけ、ボタンが変化するようにしています。

投稿日時 - 2014-08-13 18:47:30

補足

2回もご回答ありがとうございます。

追加でお聞きしたいのですが、
表示された数字に、画像をそれぞれ当てはめる方法をよろしければ教えて頂けないでしょうか。
1 =画像の1、16 = 画像の16という風にそれぞれにあてはめていきたいです。
class NumberdButton extends JButton {}
の中にImageIconを使えばいいのかなと思いしてみたのですが、ランダムな数字にくっつけていく方法がわかりません。
お手数ですが、ご教授よろしくお願いします。

投稿日時 - 2014-08-14 16:05:27

あなたにオススメの質問