2011-11-05 76 views
0

我正在用java編寫一個國際象棋程序,必須在小程序中顯示。我目前在填充棋子陣列時遇到問題。這是目前正在我的JApplet的paint()方法中完成的,我知道這是錯誤的,因爲paint可以被調用多次。我已經嘗試創建數組並將其填充到我的初始化方法中,但這根本不起作用。任何幫助,將不勝感激。Java國際象棋小程序

public class DrawChessBoard extends JApplet 
     implements MouseListener, MouseMotionListener { 

    ChessPiece myPiece; 
    ImageIcon square; 
    ImageObserver observer; 
    ChessBoard gameBoard; 
    boolean isMouseDragging = false; 
    int size; //square dimensions 

    public void initialize() { 
     setBackground(Color.white); 
     Image bSquare = square.getImage(); 
     size = bSquare.getWidth(observer); 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 

    public void paint(Graphics h) { 
     Graphics2D g = (Graphics2D) h; 
     //System.out.println("Am I being called more than once?"); 
     gameBoard = new ChessBoard(8); 
     gameBoard.start(); 
     gameBoard.paintBoard(g); 
     gameBoard.paintComponent(g); 
    } 
} 
+1

看到這個[示例](http://stackoverflow.com/questions/2561690/placing-component-on-glass-pane/2562685#2562685)和[變化](http://stackoverflow.com/questions/ 2561690 /放置組分在玻璃上窗格/ 2563350#2563350)。 – trashgod

+1

定義「根本不起作用」?我想這正是你想要初始化它的地方,至少讓事情開始。 (例如,您可能*也想*在新遊戲開始時初始化它。) –

回答

3

不要在paint方法中使用程序邏輯。在很多方面這是錯誤的。這些代碼不僅會被多次調用,而且會超出你的控制範圍,這會使程序圖形變慢。繪畫應該在JPanel或其他JComponent的paintComponent方法中完成,並且此方法應僅關注繪畫。

順便說一句,你的init方法在哪裏?這就是大部分代碼應該去的地方。

下面是在JPanel上完成的國際象棋應用示例:does-adding-a-jlabel-to-a-jpanel-hide-the-jpanel。由於它位於JPanel上,它可以很容易地放置在JApplet的contentPane中並顯示在一個applet中。

2

您必須將遊戲規則與應用程序的可視化部分分開。

閱讀有關模型 - 視圖 - 演示者或模型 - 視圖 - 控制器設計模式。它會幫助你。

0

嘗試Model-View-Controller的設計模式。在該模式中,程序邏輯在控制器部分執行,但您在View部分執行。有龍!