1

这是一个困扰我3天的问题。我必须重写一个小tictactoe(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

我看到两个解决方案:

  • 使用 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() 方法,以表明您有责任避免有害地进行子类化。
  • 使每个 Button 成为一个 Composite,它允许子类化,并在 Composite 中放置一个 Button。
  • 为每个按钮创建一个单独的侦听器。
  • 在单个侦听器中,在 buttonTable 中搜索调用该侦听器的按钮。
于 2012-06-04T14:33:31.167 回答