0

私はマインスイーパタイプのゲーム、より具体的にはMSNゲームで機能していた2人用ゲームを作成しようとしています。Tileオブジェクトの多次元配列があります。各タイルには状態(地雷、空白、または隣接する地雷の数)があります。プログラムのフロントエンドのすべての側面を処理するGUIクラスがあります。

各タイルはJButtonを拡張し、MouseListenerを実装しますが、ボタンをクリックしても、対応するボタン/タイルのMouseClickedメソッドは起動されません。

コードは次のとおりです。

public class Tile extends JButton implements MouseListener {

private int type;

public Tile(int type, int xCoord, int yCoord) {
    this.type = type;
    this.xCoord = xCoord;
    this.yCoord = yCoord;
}

public int getType() {
    return type;
}

public void setType(int type) {
    this.type = type;
}

@Override
public void mouseClicked(MouseEvent e) {
    System.out.println("Clicked");
}

}

そしてGUIクラス:

public class GUI extends JPanel {

JFrame frame = new JFrame("Mines");
private GameBoard board;
private int width, height;

public GUI(GameBoard board, int width, int height) {
    this.board = board;
    this.width = width;
    this.height = height;
    this.setLayout(new GridLayout(board.getBoard().length, board.getBoard()[0].length));
    onCreate();
}

private void onCreate() {
    for (int i = 0; i < board.getBoard().length; i++) {
        for (int j = 0; j < board.getBoard()[i].length; j++) {
            this.add(board.getBoard()[i][j]);
        }
    }

    frame.add(this);
    frame.setSize(width, height);
    frame.setMinimumSize(this.minFrameSize);
    frame.setPreferredSize(new Dimension(this.width, this.height));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
}

GUIクラスJPanelはMouseClickイベントをインターセプトして、ボタンがクリックイベントを受信できないようにしますか?

4

2 に答える 2

3

When a button is clicked (whatever you use to click it, including the keyboard), it fires an ActionEvent. You should use an ActionListener instead of a MouseListener.

Read the Swing tutorial.

It's also bad practice to extends Swing components. You should use them. A button shouldn't listen to itself. The user of the button should listen to the button events.

于 2013-01-23T14:48:12.080 に答える
3

It does not fire because you don't assign the listener to the button:

public Tile(int type, int xCoord, int yCoord) {
    this.type = type;
    this.xCoord = xCoord;
    this.yCoord = yCoord;
    addMouseListener(this); // add this line and it should work
}

However, if you just want to listen clicks, you should use ActionListener instead of MouseListener

于 2013-01-23T14:48:25.737 に答える