2014-01-23 126 views
0

我正在嘗試製作棋盤格,並從我正在使用的CS類中獲取模板。但是,當我運行它時,屏幕上沒有任何東西出現。我猜測我錯過了一些代碼實際上在屏幕上繪製廣場,但我已經嘗試了很多東西,但仍然沒有。試圖製作棋盤格

import java.applet.Applet; 
    import java.awt.*; 
    import java.util.Random; 
    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import javax.swing.event.*; 


    public class Checkers extends JApplet 
    { 
    private final int MAX_SIZE = 8; 
    private final int APP_WIDTH = 400; 
    private final int APP_HEIGHT = 400; 
    private final int MAXSIZE = 8; 


    Square[][] sq; 

    public void paint(Graphics page) 
    { 

    setBackground(Color.white); 
    fillBoard(page); // draws the method that will draw the checkers 
    setSize (APP_WIDTH,APP_HEIGHT); 

    } 

    public void fillBoard(Graphics page) 
    { 
     sq = new Square[8][8]; 

     int x,y; 
     Color rb; 

     for (int row = 0; row < MAXSIZE; row++) 
     for (int col = 0; col < MAXSIZE; col++) 
     { 
      x = row * (APP_WIDTH/MAXSIZE); 
      y = col * (APP_HEIGHT/MAXSIZE); 
      if ((row % 2) == (col % 2)) 
       rb = Color.red; 
      else 
       rb = Color.blue; 
      sq[row][col] = new Square (x, y, rb); 
     } 
    } 

    class Square 
    { 


    private int x, y = 0; 
    private Color c; 
    private boolean occupied; 
    private Color checkerColor; 


    public Square (int x, int y, Color c) 
    { 
     this.x = x; 
     this.y = y; 
     this.c = c; 
    } 

    public void setX (int x) 
    { 
     x = this.x; 
    } 

    public int getX() 
    { 
     return x; 
    } 

    public void setY (int y) 
    { 
     y= this.y; 
    } 

    public int getY() 
    { 
     return y; 
    } 

    public void setColor (Color c) 
    { 
     c = this.c; 
    } 

    public Color getColor() 
    { 
     return c; 
    } 

    public void setOccupy (boolean occupied) 
    { 
     occupied = this.occupied; 
    } 

    public boolean getOccupy() 
    { 
     return occupied; 
    } 

    public void setCheckerColor (Color c) 
    { 
     checkerColor = this.checkerColor; 
    } 

    public Color getCheckerColor() 
    { 
     return checkerColor; 
    } 

    public String toString() 
    { 
     return ("X coordinate: " + x + "\nY coordinate:" + y + "\nSquare color: " + c); 
    } 


    public void draw (Graphics page) 
    { 
     page.setColor(c); 
     page.fillRect(x, y, 50, 50); 
    } 
+0

這段代碼是否編譯? – Baby

+0

參見[如何使棋盤(http://stackoverflow.com/a/21096455/2587435)或[製作了一個強大,可調整大小的棋盤(http://stackoverflow.com/q/21142686/2587435) –

+0

更新以擺脫我沒有粘貼的額外方法,因爲它不相關。 –

回答

2

你永遠不會打電話Square#draw

話雖如此,每次調用paint的方法時,我都會警惕撥打fillBoard,事實上我會阻止您首先重寫paint

我可能要做的是檢查sq是否爲然後只生成數組。回到繪畫方法中,我會簡單地使用複合循環和每個正方形的draw

而是壓倒一切的JAppletpaint的,你應該用的東西開始喜歡JPanel並重寫它的paintComponent方法,請確保調用super.paintComponent

您應該這樣做的原因有很多,但是這裏的主要原因是JApplet沒有雙緩衝,這意味着您在繪圖更新時會「閃爍」。 JPanel默認爲雙緩衝,爲您節省大量的工作和時間,不得不實施您自己的解決方案...

完成此操作後,將自定義面板添加到小程序中。

我會將所有的繪畫邏輯移動到它。看看Performing Custom Painting更多細節

+0

謝謝你的建議。我會研究你提到的。我的教授在代碼中加入了一些評論,我沒有簡單列入,我們通常會使用一個init()方法,但是對於我們目前的級別來說這太難了。如果我受限於更改代碼的這些部分,我將如何去調用Square#繪製? –

+0

基本上,正如我所說的,我會在'fillBoard'中檢查'sq'是否爲'null',如果是,則會創建邊界。回到你的'paint'方法中,你可以使用'fillBoard'中使用的類似複合'for-loop',但不是創建'Square's,而是簡單地調用'sq [row] [col] .draw( ;'''''另外,你應該在'paint'方法中做的第一件事是調用'super.paint(page)' – MadProgrammer

+0

對不起,你應該在applet'paint'中調用'super.paint(page)''方法不是'Square'的'draw'方法;) – MadProgrammer

0

嘛,據我可以看到,除非我錯過了什麼,你從來沒有真正被稱爲重繪或油漆或繪製方法。這個代碼的設置與我看到要完成類似任務的大多數其他代碼的設置不同,我並不是真的想把它全部弄清楚,但你必須實際調用該方法來繪製圖像。但是,請確保您密切注意您調用此方法的位置,因爲正確放置它非常重要,否則可能無法正確使用它的功能。