2011-03-16 35 views
0

我正在嘗試使河內解算器只是解決河內沒有任何鼠標事件的塔。問題是,當我移動矩形原始的遺骸時,即使重新繪製後。我搜索了網絡,並試圖改變代碼,但沒有工作。如果改變了任何東西,我在裏面使用一個帶有JPanel的JFrame。
我有我的磁盤類這裏只是一個帶顏色的矩形。在Swing JPanel中移動一個矩形:原始停留

class Disk extends Rectangle { 

    Color diskColour; 

    public Disk(int a, int b, int c, int d, Color colour) { 
     x = a; 
     y = b; 
     width = c; 
     height = d; 
     diskColour = colour; 
    } 

    public Color getColour() { 
     return diskColour; 
    } 

    public void paintSquare(Graphics g) { 
     repaint(); 
     g.setColor(diskColour); 
     g.fillRect(x, y, width, height); 
     repaint(); 


    } 
} 

這裏是我的代碼,我實際調用該方法paintSquare:

public void simpleMoveDisk(Disk[] disks, int n, Graphics g) { 

    disks[n].setLocation(30,25); 
    disks[n].paintSquare(g); 
    repaint(); 

} 

的paintSquare方法繪製的磁盤,而setLocation方法改變其座標。 當這個運行矩形發生在新的位置,但舊的仍然存在。任何幫助表示讚賞,在此先感謝。

回答

1

你打電話repaint()在幾個地方,你不應該。

讓您的頂級課程正在進行繪畫,請調用paintSquare方法和任何其他需要的方法。這些方法不應該調用repaint()。

此外,您的簡單移動磁盤真的很奇怪,因爲它傳遞了磁盤陣列,索引和圖形對象。相反,它只需要一個磁盤。只需將它傳遞給需要更新的陣列即可。然後讓任何調用simpleMoveDisk的類分別調用repaint,而不是嘗試使用相同的方法繪製和更新模型。

+0

感謝您的答:我已根據您的答案更改了代碼,矩形仍然保留。 'public void simpleMoveDisk(Disk disks){ moves ++; disks.setLocation(20,30); }' – ultimateY 2011-03-17 14:01:23

+0

然後您需要發佈SSCCE。 – jzd 2011-03-17 14:02:49

+0

謝謝你的幫助。我發現了這個問題。這是因爲我初始化磁盤位置的initDisk方法被多次調用。即使移動了磁盤,磁盤也會重新初始化。確保它只運行一次後,原始消失。 – ultimateY 2011-03-17 14:17:17