在Java中逐步刷新JTable

时间:2014-12-16 18:30:40

标签: java jtable pacman

我正在使用Java中的A *算法进行Pacman游戏。我搜索了很多问题。我找到了一步的解决方案。但我想在块中刷新我的表,我的解决方案是根据最后一步(只显示结果)刷新JTable(计算所有步骤)。但我希望刷新并逐步显示Pacman的位置(位置)。它必须看起来像Pacmans正在移动。但我无法做到。我的代码如下:

btnStartGame.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        //randomly placement of Pacmans
        table_1.setValueAt(yellowPacman, locationyellowX, locationyellowY);
        ...calculating heuristics
        //after calculation
        newXYellow =locationyellowX;
        newYYellow =locationyellowY+1;
        nodeYellow = 10 * newXYellow + newYYellow;
        while(heuristics != zero){  
            ...enemy pacmans' movement
            //after enemy pacmans' movement calculating yellow pacman's movement            
            if((newXYellow>=0 && newXYellow<10 && newYYellow>=0 && newYYellow<10) &&  !wallList.contains(nodeYellow)){
                //calculate heuristic again
                manhattanDistance[0][0] = Math.abs(newXYellow-locationblackX[0])+
                              Math.abs(newYYellow-locationblackX[0]);
                manhattanDistance[0][1] = Math.abs(newXYellow-locationblackX[1])+
                              Math.abs(newYYellow-locationblackX[1]);
                manhattanDistance[0][2] = Math.abs(newXYellow-locationblackX[2])+
                              Math.abs(newYYellow-locationblackX[2]);
                fyellow[0] = manhattanDistance[0][0] + manhattanDistance[0][1] + manhattanDistance[0][2];
                selectedNodeXYellow = newXYellow;
                selectedNodeYYellow = newYYellow;
                timer2.start();//updated    
                while(delay != 0)
                    delay--;
                delay = 4000; 
                locationyellowX = selectedNodeXYellow;
                locationyellowY = selectedNodeYYellow;
                nodeYellow = 10 * selectedNodeXYellow+ selectedNodeYYellow;
                timer3.start();//updated
                while(delay != 0)
                    delay--;
                delay = 10000; 
            }//ending if
        }//ending while
    }
}//ending action    
timer2 = new Timer(ONE_SECOND, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        table_1.setValueAt(null, locationyellowX, locationyellowY);//I wanted to delete old moves                
        timer2.stop();
    }    
});
timer3 = new Timer(ONE_SECOND, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        table_1.setValueAt(yellowIcon, locationyellowX, locationyellowY);//here I want to show each moves step by step in while block                
        timer3.stop();
    }    
});

更新1: 延迟只是一个想法。也许算法计算得太快,定时器无法触发。但它没有工作,也没有计时器假设每一秒被解雇?我还是看过JTable的最后一个值。

1 个答案:

答案 0 :(得分:1)

我怀疑你的主要问题是你需要了解Java GUI应用程序中的各种线程是如何工作的。具体来说,如果您在事件调度线程中执行代码,则在执行该代码时将不会对UI进行更新。在您的情况下,您正在对JTable进行多次更新,然后将控件返回到显示器,然后显示最后一个值。

这里的解决方案是引入一个计时器元素,在计时器的每个刻度中执行算法的每一步,然后返回控件以显示结果。有关详细信息,请查看javax.swing.Timer类。我还建议您阅读Java教程中的“Swing中的并发性”和“如何使用Swing Timers”部分。