0

こんにちは、チェスですが、騎士だけのラツク ゲームをしようとしています。

import javax.swing.JButton;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.Icon;
import javax.swing.ImageIcon;

public class Knight {
    private Icon image;
    private int w;
    private int k;
    private Random rand;

    public Knight() {
        image = new ImageIcon(getClass().getResource("redKnight.gif"));
        w = rand.nextInt(9);
        k = rand.nextInt(9);
    }

    public void Caballo(JButton[][] matriz, int i, int j) {
        matriz[i][j].setIcon(image);

        matriz[i][j].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //Execute when button is pressed
                matriz[i][j].setBackground(Color.RED);
            }
        });
    }
}

だから私は本当にうまくいくかどうかわからない再帰的な方法をやろうとしていました。しかし、問題は、内部でaddActionListener、netbeans が、変数が最終的なものでなければならないことを教えてくれることです。その理由はわかりません。実行すると、画像がまったく表示されません

ここに残りのコードがあります

import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.*;
import javax.swing.JPanel;
import java.util.Random;

public class Tablero {
    private JButton[][] mesa;
    private Random rad;
    public Tablero() {
        mesa = new JButton[8][8];
    }

    public void cuadriculado(JFrame ventana) {
        JPanel panel = new JPanel(new GridLayout(8, 8, 0, 0));

        for (int i = 0; i < mesa.length; i++) {
            for (int j = 0; j < mesa[0].length; j++) {
                mesa[i][j] = new JButton();
                mesa[i][j].setPreferredSize(new Dimension(40, 40));
                panel.add(mesa[i][j]);

            }
        }
        for (int r = 0; r < mesa.length; r++) {
            for (int t = 0; t < mesa[0].length; t++) {
                if (r % 2 == 0 || r == 0) {
                    if (t % 2 == 0 || t == 0) {
                        mesa[r][t].setBackground(Color.BLACK);
                    } else {
                        mesa[r][t].setBackground(Color.WHITE);
                    }
                } else {
                    if (t % 2 == 0 || t == 0) {
                        mesa[r][t].setBackground(Color.WHITE);
                    } else {
                        mesa[r][t].setBackground(Color.BLACK);
                    }
                }
            }
        }

        ventana.setContentPane(panel);
        ventana.setSize(500, 500);
        ventana.setVisible(true);
        Knight kn =new Knight();

        kn.Caballo(mesa, rad.nextInt(9), rad.nextInt(9));
    }
}

どんな助けでも大歓迎です。私は Java に本当に慣れていないので、何も説明されていなかったので、かなり苦労しました。

4

2 に答える 2

1
matriz[i][j].setBackground(Color.RED);  

匿名の内部クラスから「matriz」にアクセスしようとしているため、変数はクラス変数または最終変数である必要があります。

なぜこのメソッドを Knight クラスに属するようにしたのか疑問に思います。このメソッドはTablero、配列をクラス変数として定義する場所であるため、クラスの一部である必要があります。そうすれば、コンパイラの問題は発生しません。

しかし、本当にメソッドを Knight クラスに保持したい場合、コードは次のようになります。

public void Caballo(**final** JButton[][] matriz, int i, int j) {

実行すると、画像がまったく表示されません

image = new ImageIcon(getClass().getResource("redKnight.gif"));

アイコンを作成するだけです。それをラベルに追加してから、そのラベルを GUI に追加する必要があります。

私はJavaが初めてで、これについて何も説明されていませんでした

Swing チュートリアルを読むことから始めます。のセクションHow to Use Iconsから始めるのがよいでしょう。

于 2013-06-15T19:29:21.057 に答える
0

これを変更してみてください

public void Caballo(JButton[][] matriz, int i, int j)

これに

public void Caballo(final JButton[][] matriz, final int i, final int j)

変数を final にする必要があるのは、ActionListener の actionPerformed 内で変数にアクセスするためです。Java は、これらの変数を使用する前に、これらの変数が変更されないことを認識する必要があります。Java ガベージ コレクターの話に戻りますが、私はとりとめたくありませんが、それは冗談です。

于 2013-06-15T19:28:28.487 に答える