1

今3日間イライラするのが問題です。小さな三目並べ(nxnの五目並べ)ゲームのUIを書き直さなければなりません。問題は、swing GUIを作成したときに、JButtonプロパティを継承する新しいクラスを作成し、行のintと列のintを追加したことです。SWT(継承なし)ではそれができません。iとjの値をボタンに追加する方法はありますか。

Swingの例は次のとおりです。

for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        final MyJButton button = new MyJButton(i, j);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                MoveResult move = game.move(button.getRow(), button.getCol());
                    switch (move) {
                        case ValidMove:
                            button.setBackground(game.getCurrentPlayer().getColor());
                            game.changePlayer();
                            break;
                    }
                }
            }
        }
    }
}

動きをチェックするためにテーブルクラスにそれを与えるゲームクラスのiとjを与えます。

if (table.getElement(x, y) != PieceType.NONE) return MoveResult.InvalidMove;
private PieceType[][] table;

SWTで同じことを行う方法はありますか?どんな兆候も歓迎されます。

これは私が作ったものです

buttonpanel = new Composite(shell, SWT.NONE);
buttonpanel.setLayout(new org.eclipse.swt.layout.GridLayout(cols, true));
buttonTable = new Button[rows][cols];

for (int i = 0; i < rows; ++i){
    for (int j = 0; j < cols; ++j) {
        gridData.heightHint = 45;
        gridData.widthHint = 45;

        Button button = new Button(buttonpanel, SWT.PUSH);
        button.setLayoutData(gridData);
        buttonTable[i][j] = button;
        buttonTable[i][j].addSelectionListener(new buttSelectionListener());    
        // buttonpanel.pack();
    }
}
4

2 に答える 2

2

私は2つの解決策を見ます:

  • Button の setData メソッド (Widget スーパークラスで定義) を使用して、x と y を含むオブジェクトを関連付けます (これらのデータは、リスナーに提供されるイベント オブジェクトで見つかります)
  • ボタンごとに異なるリスナーを使用する

あなたの場合、最初の解決策が最も自然な解決策のようです。これは、x と y を保持するクラス (Cell と呼びましょう) を作成し、次のことを行うことを意味します。

button.setData(new Cell(i, j));

そしてあなたのリスナーで

game.move(e.data.x, e.data.y);
于 2012-06-04T14:28:16.993 に答える
0

オプションは次のとおりです。

  • Button をサブクラス化し、その checkSubclass() メソッドをオーバーライドして、有害なサブクラス化を行わない責任があることを示します。
  • サブクラス化を可能にする各ボタンをコンポジットにし、ボタンをコンポジットに配置します。
  • ボタンごとに個別のリスナーを作成します。
  • 単一のリスナーで、リスナーを呼び出すボタンの buttonTable を検索します。
于 2012-06-04T14:33:31.167 に答える