如何从事件中获取数据到主函数?

How to get data from events to the main function?

提问人:Dawa 提问时间:7/3/2021 更新时间:7/3/2021 访问量:98

问:

我目前正在创建一个国际象棋游戏。这也是我尝试创建 gui 的第一个项目,所以请告诉我是否有更简洁的方法来编写此代码。因此,我使用 java swing 创建了 64 个按钮,这些按钮在按下时会将其坐标打印到控制台。

我还设法在我的 main 方法中创建一个循环,以使用控制台输入运行我的国际象棋引擎。我的问题是我不知道如何将坐标从我的 eventListeners 获取到我的主循环,以便它移动一段。

我添加了主循环和操作执行方法。希望这足以解决我的挣扎。

感谢所有花时间帮助我的人!

    public static void main(String[] args) throws IOException{
    int[] coordinates = new int[4];
    
    Player player = new Player();
    Board board = new Board();
    Input input = new Input();
    board.showBoard();
    // here I give the gui object the references to my input and board objects 
    // so that it can call their methods and thereby give the information to them   
    Gui gui = new Gui(board, input); 

    
    while(!player.isCheckmate(board)) { 
    
        coordinates = input.getInput(board, player).clone();// get coordinates xpos, ypos, xposnew, yposnew
    
        Piece activePiece = board.getPiece(coordinates[0], coordinates[1]); // get the chosen piece
        
        if(!activePiece.isLegalMove(board, coordinates[2], coordinates[3]))// move the active piece to chosen destination
        {
            System.out.println("No legal move. Try again");
            continue;
        }
        
        activePiece.move(board, coordinates[2], coordinates[3]);
        
        player.switchPlayerTurn();
        
        player.isCheckmate(board);
        board.showBoard();
    }
     
}

下面是 actionPerformed 方法

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        // TODO Auto-generated method stub
        JButton button = (JButton) e.getSource();
        String[] numbers = button.getActionCommand().split("");
        
        if(coordinates[2] !=-1)
        {
            for(int i = 0; i < coordinates.length; i++)
                coordinates[i] = -1;
        } 
        if(coordinates[0] == -1) {
            coordinates[0] = Integer.parseInt(numbers[0]);
            coordinates[1] = Integer.parseInt(numbers[1]);
        } else if(coordinates[2] == -1) {
            coordinates[2] = Integer.parseInt(numbers[0]);
            coordinates[3] = Integer.parseInt(numbers[1]);
            }
        
        System.out.println("x coodinate = " + Integer.toString(coordinates[0]));
        System.out.println("y coodinate = " + Integer.toString(coordinates[1]));
        System.out.println("destination x coodinate = " + Integer.toString(coordinates[2]));
        System.out.println("destination y coodinate = " + Integer.toString(coordinates[3]));
        
    }
Java Swing 事件

评论

0赞 CcmU 7/3/2021
我可以建议你不要使用按钮吗?我认为创建一个自定义类会更容易,该类将从其他部分扩展。此外,您可以简单地设置一个动作侦听器并处理母类 () 中的单击/拖动。PiecePiece
0赞 Dawa 7/3/2021
我已经有一个母亲级的作品,所以这应该没有问题。我最初这样做是为了将我的输入与游戏的其余部分分开。您将如何设置拖放功能?如果您没有时间举例,一些链接会很棒。正如我所说,这是我第一次编写 GUI。
1赞 Tim Hunter 7/3/2021
@Dawa拖放教程

答:

2赞 Tim Hunter 7/3/2021 #1

关于将数据从事件传递到主事件,您需要携带对管理坐标的对象的引用(我假设这是您的对象)。您需要添加如下内容:PieceBoard

class Board {
  //Other class stuff
  
  public void setPiecePosition(Piece targetPiece, Point coordPoint) {
    //Code to update your tracking
  }
}

然后将如下内容添加到您的事件中:

board.setPiecePosition(targetPiece, new Point(xCoord, yCoord));

评论

0赞 Dawa 7/3/2021
感谢 Tim Hunter 提供的解决方案和教程链接。两者都非常有帮助!
1赞 Tim Hunter 7/3/2021
@Dawa 建议...仔细考虑责任划分。应该关心什么?管理与其他对象的交互是对象的工作,还是对象的工作?是否关心它的位置或关心?句柄坐标和对象应该占据它们,还是应该将其委托给对象?这些问题没有错误的答案,只是在整体设计方法中需要考虑的问题。PiecePiecePieceBoardPieceBoardBoardTile
0赞 Dawa 7/3/2021
再次感谢。我没有花太多心思。我会在我的下一个项目中牢记这一点。再次感谢!