我用JAVA写五子棋人机博弈的程序,每落一子都调用repaint()对棋盘进行重绘。但现在的情况是人落子后并没有显示出棋子,也就是没有重绘,只有计算机落子后才会同时出现两个子。
于是我在AlphaBetaSearch类内实现Callable接口,用一个新的线程实现计算机落子位置的搜索,调用代码如下:        AlphaBetaSearch ab = new AlphaBetaSearch(this);
        ExecutorService exec = Executors.newFixedThreadPool(1);
        Future<Integer> future = exec.submit(ab);
        
        try {
            computerMovePosition = future.get();
        } catch (ExecutionException e) {
            System.out.println(e.toString());
        } catch (InterruptedException e) {
            System.out.println(e.toString());
        }
但仍然不行,请达人帮忙看下要怎么做才能实现每落一子即重绘一下棋盘,谢谢!

解决方案 »

  1.   

    是在监听。我估计问题的原因是搜索落子位置阻塞了repaint(),所以把计算机搜索落子位置设计为一个线程,并试过把线程的优先级设为最低,但仍然没用。
      

  2.   

    怎样才能知道repaint()动作是否已经完成?
      

  3.   

    你把人下棋(鼠标点击)和计算机落子都放到一个线程里面啊,这样肯定有一个先后顺序啊,这样当你在对鼠标点击事件处理的时候你进行一次绘画,然后你实在不行还要重写的paint()方法…………
      

  4.   

    谢谢guoxiaopeng1982和KK3K2005,问题已经解决了。之前定义的线程只包含搜索计算机落子位置并返回该位置的功能,现在我重新设计了线程,把计算机落子的所有步骤都包含了进去,包含位置搜索、重绘棋盘和状态判断,然后问题就解决了。repaint()只会发出一个重绘请求,但不会立即执行重绘,所以就出现了之前的情况,两次重绘请求(先后画两个棋子)合并成了一个。现在由于人落子后重绘和计算机落子后重绘不属于同一个线程,所以重绘操作不会合并,人落子后无论计算机搜索是否完成都会把人刚落的子显示出来。