如何将任何类型的对象附加到Java中的JButton?

时间:2018-04-23 15:27:23

标签: java user-interface chess

我目前正在为国际象棋游戏创建一个GUI。这是一项大学任务。目前,我们已经完成了发动机。 因此,对于电路板,我已经使用下面的代码创建了一个JButton的2D数组。

public class GUI extends JFrame implements ActionListener {

    private JPanel gameBoard;
    private JButton[][] board = new JButton[4][4];
    gameBoard = new JPanel();
    add(board);
    gameBoard.setLayout(new GridLayout(7, 6));
    gameBoard.setBounds(400, 30, 700, 700);
    board = new JButton[4][4] 
    for(int i = 0;i<4;i++) {
      for(int j = 0;j < 4;j++) {
         board[i][j] = new JButton();
         gameBoard.add(board[i][j]);
      }
    }
}  

我是初学者,所以如果这段代码给你一个噩梦哈哈,我很抱歉,但如果有人接受我的实施并且告诉我如何从引擎中添加一个实际的片段,我会喜欢它。发动机自己组装零件并创建自己的板。我还在我的GUI中初始化了一个新游戏,因此我可以使用我的引擎方法而不是getsPieces等。我的问题是,如何将类型为Piece的对象附加到JButton?谢谢!此外,我还会提供有关如何改进我的问题的提示,谢谢。

1 个答案:

答案 0 :(得分:0)

我看到了几个解决方案:

使用地图绑定

你可以考虑做相反的事情:创建一个地图将一个按钮绑定到一个胸部(就像一种SQL连接表)。你可以实现类似的东西:

final Map<Piece, JButton> piecePositions = new HashMap<>();

// When game starts, fill the map
void start() {
    piecePositions.put(whiteTower1, btnx0y0);
    ...
}

// When you move a piece, all you have to do is changing the assignment
void move (Piece toMove, JButton destination) {
    piecePositions.put(toMove, destination);
}

使用自定义图标

另一个答案是创建Icon的子类,它具有Piece作为属性。这样,您可以通过图标直接将作品与JButton相关联,作为奖励,您的按钮将立即显示作品图标。

class PieceIcon extends ImageIcon {
    final Piece piece;

    PieceIcon(URL pieceImage, Piece piece) {
        super(pieceImage);
        this.piece = piece;
    }

    // When you move, you change your buttons
    public void move(JButton from, JButton to) {
        to.setIcon(from.getIcon());
        from.setIcon(null);
    }
}

最后一句话

但是,我必须承认以前的答案都是黑客攻击。为了正确管理游戏板,我会通过创建一个&#34; Grid&#34;来增加一个间接级别。课程,其职责是管理董事会任务。通过这种方式,您可以测试多种解决方案,这些解决方案远比我所建议的更为进步。

祝你的项目好运。